2014-06-30 15 views
6

Tôi đang đọc C++ Đồng thời trong Hành động bởi Anthony Williams và không hiểu việc triển khai push của lớp lock_free_stack.C++ 11 khóa ngăn xếp miễn phí

Tại sao trên trái đất, nguyên tử load không nằm trong vòng lặp while? Lý do ông đưa ra là:

Do đó, bạn không phải tải lại đầu mỗi lần qua vòng lặp, vì trình biên dịch thực hiện điều đó cho bạn.

Nhưng tôi không nhận được hình ảnh. Ai đó có thể làm sáng tỏ về điều này?

template<typename T> 
class lock_free_stack 
{ 
private: 
struct node 
{ 
    T data; 
    node* next; 
    node(T const& data_) : 
    data(data_) 
    {} 
}; 
std::atomic<node*> head; 
public: 
void push(T const& data) 
{ 
    node* const new_node=new node(data); 
    new_node->next=head.load(); 
    while(!head.compare_exchange_weak(new_node->next,new_node)); 
} 
}; 

Trả lời

6

Khoá nằm trong giao diện compare_exchange_weak, trong trường hợp này có 2 đối số. Đầu tiên là tham chiếu đến giá trị mong đợi và giá trị thứ hai là giá trị mong muốn. Nếu giá trị hiện tại của nguyên tử không bằng với đầu vào mong đợi, nó sẽ trả về false và đầu vào được mong đợi được đặt thành giá trị hiện tại.

Vì vậy, trong trường hợp này, những gì nó đang làm là đặt new_node->next = head. Sau đó, điều này nói rằng nếu head vẫn bằng new_node->next, hãy đổi lại thành head. Nếu không còn giá trị đó, giá trị này sẽ sử dụng tham chiếu đến new_node->next để gán giá trị hiện tại là head. Vì mỗi lần lặp của vòng lặp không thành công cũng thay thế new_node->next với giá trị hiện tại là head, không có phép đọc lặp lại trong phần thân của vòng lặp.

+0

Vâng, giờ đây, nó hoàn toàn có ý nghĩa. Cảm ơn! – Stringer

3

Từ các tài liệu của compare_exchange_weak:

nguyên tử so sánh giá trị được lưu trữ trong * này với giá trị của mong đợi, và nếu những đều bình đẳng, thay thế cựu với mong muốn (thực hiện đọc-chỉnh sửa-ghi hoạt động). Nếu không, tải giá trị thực tế được lưu trữ trong * điều này vào dự kiến ​​(thực hiện hoạt động tải).

Như bạn thấy, nếu không, giá trị thực tế là head sẽ được tải vào dự kiến.

Các vấn đề liên quan