【发布时间】:2020-03-30 13:17:43
【问题描述】:
考虑这段代码(来自'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 不会中断。
对吗?
【问题讨论】:
-
compare_exchange_weak更新其第一个参数以匹配第二个。这就是打破循环的原因。