[英]C++ atomic CAS(compare-and-swap) operation does not change value
在以下示例中,实际发生了什么? 为什么兑换成功后价值不变?
直播: https://wandbox.org/permlink/f5VYSKfQ9UJqa8FQ
std::atomic<bool> flag{false};
int main()
{
std::thread thread([](){
while(true){
// wait until flag not becomes true
{
bool expect = true;
while(!flag.compare_exchange_strong(expect, false, std::memory_order_acq_rel)){
std::cout << "wait" << std::endl;
}
}
std::cout << "work" << std::endl;
}
});
flag.store(true, std::memory_order_release);
thread.join();
}
Output:
work
wait
work
wait
...
考虑会发生什么:
bool expect = true;
while(!flag.compare_exchange_strong(expect, false, std::memory_order_acq_rel)){
std::cout << "wait" << std::endl;
}
当标志为假时。 while 循环中的测试第一次运行时, expect
将为真,因此与标志不匹配。 所以expect
更新为false,function返回false。 所以wait
被打印并且循环重复。 循环中的第二个测试, expect
现在将为 false,它与flag
匹配,因此flag
将设置为 false(已经是 noop),并且循环将退出。
最终效果是始终将flag
设置为 false,如果它已经为false
,则打印wait
。 因此,您看到的 output。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.