Ben*_*ski 5 c++ concurrency atomic
想象一下有两个线程,一个给一个(已经初始化的)bool赋值,另一个线程读取/检查这个bool.如果对bool的访问没有被保护或者bool是非原子的,那么线程清理程序可能会在这里检测到可能的数据竞争.
这怎么可能?是否有可能分配给bool并不总是原子的,例如,由于缓存层次结构或无序执行等硬件特性?
即使C++标准没有强制要求,实际上也不可能在x86上"中间" 获得撕裂效果bool,即在另一个线程访问它时仅部分更改值.但是,CPU可能正在维护它的多个副本,例如,作为每个内核的高速缓存.因此,在另一个线程完成将其更改为新线程之后,一个线程可以"看到"较旧的值.std::atomic(特别是在您的情况下std::atomic<bool>)为您提供了解决此问题的内存障碍.