当我有一个std::condition_variable cond和一些bool flag时,我可以使用谓词等待它:
cond.wait_for(some_lock, std::chrono::milliseconds(100), { return flag; })现在我想知道:从技术上讲,C++在C++11中只有一个合适的多线程内存模型,而在多线程上下文中访问flag变量基本上是没有定义的。因此,我必须声明它为std::atomic<bool>,以避免这种未定义的行为,对吗?
我特别想知道:如果我没有声明它为std::atomic,那么我是否会一直从flag中读取陈旧的值,因为更新永远不会进入主内存?或者这是一个“理论上是的,但实际上从来没有发生”的情况?
发布于 2018-06-12 13:24:12
从技术上讲,C++只能在C++11中获得一个合适的多线程内存模型,并且在多线程上下文中访问标志变量基本上是没有定义的。
访问C++中的线程共享变量是很好的定义,只要没有数据竞争。有关更多细节,请参见线程和数据竞赛:
..。特别是,在通过另一个线程获取相同的互斥锁之前,
std::mutex的发布是同步的--因此会发生--这使得使用互斥锁来防止数据竞争成为可能。
互斥锁/解锁构成获取/释放内存屏障。对于只有在互斥锁时才被访问的线程共享状态,不需要std::atomic。当接收到条件通知时,它首先锁定互斥锁,这样您就可以安全地访问共享状态。
当人们尝试在不保留互斥锁的情况下使用std::atomic变量和访问std::mutex/std::condition_variable时,通常会引入数据竞争。一个例子。
https://stackoverflow.com/questions/50818306
复制相似问题