首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++原子CAS(比较并交换)操作不会更改值

C++原子CAS(比较并交换)操作不会更改值
EN

Stack Overflow用户
提问于 2020-07-12 23:39:00
回答 1查看 1.6K关注 0票数 1

在下面的示例中,实际发生了什么?为什么成功交换后价值没有变化?

直播:https://wandbox.org/permlink/f5VYSKfQ9UJqa8FQ

代码语言:javascript
复制
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();
}

输出:

代码语言:javascript
复制
work
wait
work
wait
...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-13 07:51:17

考虑一下发生了什么:

代码语言:javascript
复制
          bool expect = true;
          while(!flag.compare_exchange_strong(expect, false, std::memory_order_acq_rel)){
              std::cout << "wait" << std::endl;
          }

当标志为false时。第一次运行while循环中的测试时,expect将为true,因此与该标志不匹配。因此,expect被更新为false,并且函数返回false。因此,wait被打印出来,循环重复。循环中的第二个测试expect现在将为false,它与flag匹配,因此flag将被设置为false (因为它已经是一个noop ),并且循环将退出。

最终结果是总是将flag设置为false,如果已经是false,则打印wait。因此,您看到的输出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62863102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档