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。因此,您看到的输出。