Sto leggendo C++ Concorrenza in azione di Anthony Williams, e non capisco la sua implementazione push
della classe lock_free_stack
.C++ blocco 11 lock libero
Perché mai l'atomico load
non è nel ciclo while? La ragione per cui ha dato è:
Voi dunque non c'è bisogno di ricaricare la testa ogni volta attraverso il ciclo, perché il compilatore che fa per voi.
Ma non capisco l'immagine. Qualcuno può fare luce su questo?
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));
}
};
Sì, ha perfettamente senso ora. Grazie! – Stringer