scr*_*avy 0 multithreading memory-model c++11
当我有一个std::condition_variable cond和一些bool flag我可以使用谓词等待它:
cond.wait_for(some_lock, std::chrono::milliseconds(100), { return flag; })
Run Code Online (Sandbox Code Playgroud)
现在我想知道:从技术上讲,C++只在C++ 11中得到了一个合适的多线程内存模型,并且flag在多线程上下文中访问变量基本上是未定义的.所以我应该声明它std::atomic<bool>来逃避这种未定义的行为,对吧?
我特别想知道:如果我没有声明它std::atomic,那么我是否会一直读取陈旧的值,flag因为更新永远不会进入主内存?或者这是"理论上是,但实际上从未发生过"的情况?
从技术上讲,C++只在C++ 11中获得了一个合适的多线程内存模型,并且在多线程上下文中访问flag变量基本上是未定义的.
只要没有数据争用,就可以很好地定义在C++中访问线程共享变量.有关更多详细信息,请参阅线程和数据争用:
...特别是,a的释放与另一个线程获取相同的互斥锁之前
std::mutex是同步的,因此发生,这使得可以使用互斥锁来防止数据争用.
互斥锁定/解锁构成获取/释放内存障碍.您不需要std::atomic仅在互斥锁被锁定时访问的线程共享状态.收到条件通知后,它首先锁定互斥锁,以便您可以安全地访问共享状态.
人们经常在尝试使用std::atomic变量时引入数据竞争,std::mutex/std::condition_variable并在std::atomic不持有互斥锁的情况下访问变量.一个例子.