при условии, что head
является std::atomic<Node*>
, тогда код верен, например, при сбое compare_exchange_weak
загружается текущее значение переменной в ее первый параметр после вызова compare_exchange_weak
old_head
всегда будет содержать текущее значение head
.
Код примерно эквивалентен выполнению следующего без атомики:
Node* old_head = head;
while (true)
{
std::unique_lock lock(mutex);
if (old_head == head)
{
head = old_head->next;
break;
}
else
{
old_head = head;
}
}
Поэтому одновременные вызовы pop
безопасны и не должны не блокировать навсегда (кроме как из-за того, что другие потоки постоянно вызывают pop и каким-то образом всегда устанавливают значение до того, как текущий поток получает шанс).