C++ 原子 CAS(比较和交换)操作不改变值
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();
}
输出:
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,函数returns为false。所以 wait
被打印并且循环重复。
循环中的第二个测试 expect
现在将为 false,它匹配 flag
,因此 flag
将被设置为 false(一个 noop,因为它已经是),循环将退出.
最终效果是始终将 flag
设置为 false,如果已经是 false
,则打印 wait
。因此,您看到的输出。
在下面的例子中,实际发生了什么?为什么兑换成功后价值没有变化?
直播: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();
}
输出:
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,函数returns为false。所以 wait
被打印并且循环重复。
循环中的第二个测试 expect
现在将为 false,它匹配 flag
,因此 flag
将被设置为 false(一个 noop,因为它已经是),循环将退出.
最终效果是始终将 flag
设置为 false,如果已经是 false
,则打印 wait
。因此,您看到的输出。