考虑这段代码(来自'C++ concurrency in action' [第二版]:第 212 页):
void LockFreeStack::pop (stack_data& result)
{
Node* old_head = head.load();
while(!head.compare_exchange_weak(old_head, old_head->next))
;
result = old_head->data;
}
我认为线程一个执行是可能的,pop()
并且在执行第一行(加载head
)时间切片发生在线程二之后,它正在执行push(T&)
。所以现在head
原子变量的值不等于old_head
并且while
-loop 不会中断。
这是正确的 ?