首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11并发读取bool

C++11并发读取bool
EN

Stack Overflow用户
提问于 2018-06-12 13:21:06
回答 1查看 61关注 0票数 0

当我有一个std::condition_variable cond和一些bool flag时,我可以使用谓词等待它:

代码语言:javascript
复制
cond.wait_for(some_lock, std::chrono::milliseconds(100), { return flag; })

现在我想知道:从技术上讲,C++在C++11中只有一个合适的多线程内存模型,而在多线程上下文中访问flag变量基本上是没有定义的。因此,我必须声明它为std::atomic<bool>,以避免这种未定义的行为,对吗?

我特别想知道:如果我没有声明它为std::atomic,那么我是否会一直从flag中读取陈旧的值,因为更新永远不会进入主内存?或者这是一个“理论上是的,但实际上从来没有发生”的情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-12 13:24:12

从技术上讲,C++只能在C++11中获得一个合适的多线程内存模型,并且在多线程上下文中访问标志变量基本上是没有定义的。

访问C++中的线程共享变量是很好的定义,只要没有数据竞争。有关更多细节,请参见线程和数据竞赛

..。特别是,在通过另一个线程获取相同的互斥锁之前,std::mutex的发布是同步的--因此会发生--这使得使用互斥锁来防止数据竞争成为可能。

互斥锁/解锁构成获取/释放内存屏障。对于只有在互斥锁时才被访问的线程共享状态,不需要std::atomic。当接收到条件通知时,它首先锁定互斥锁,这样您就可以安全地访问共享状态。

当人们尝试在不保留互斥锁的情况下使用std::atomic变量和访问std::mutex/std::condition_variable时,通常会引入数据竞争。一个例子

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

https://stackoverflow.com/questions/50818306

复制
相关文章

相似问题

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