繁体   English   中英

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();
}

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM