我在閱讀安東尼威廉姆斯的C++ Concurrency in Action,並且不瞭解其執行lock_free_stack
類的push
類。C++ 11鎖定免費堆棧
爲什麼地球上原子load
不在while循環中?他給出的理由是:
因此,您不必每次都通過循環, 重新加載頭,因爲編譯器會爲您做到這一點。
但我不明白。有人可以對此有所瞭解嗎?
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));
}
};
是的,它現在非常有意義。謝謝! – Stringer