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));
}
};
Vâng, giờ đây, nó hoàn toàn có ý nghĩa. Cảm ơn! – Stringer