std::atomic在主流编译器上的内部实现(如 gcc 和 clang)只在内部使用 volatile; 编译器直接公开原子加载、存储和 RMW 内置函数。(例如,GNU C __atomic内建操作“普通”对象。)
Volative 在实践中是可用的(但不要这样做)
也就是说,volatile在实践中可用于诸如 all (?)上的 exit_now标志之类的事情实际 CPU 上现有的 C + + 实现,因为 CPU 是如何工作的(一致性缓存) ,以及关于 volatile应该如何工作的共享假设。除此之外就没什么了,这是 没有推荐的。这个答案的目的是解释现有的 CPU 和 C + + 实现实际上是如何工作的。如果您不关心这一点,那么您只需要知道,使用 mo _ rest 的 ABC3在线程方面取代了 volatile。
(ISO C + + 标准对此模糊不清,只是说 volatile访问应该严格按照 C + + 抽象机的规则进行评估,而不是优化掉。假设真正的实现使用机器的内存地址空间来建模 C + + 地址空间,这意味着 volatile读取和分配必须编译为加载/存储指令来访问内存中的对象表示。)
// global
bool exit_now = false;
// in one thread
while (!exit_now) { do_stuff; }
// in another thread, or signal handler in this thread
exit_now = true;
// Optimizing compilers transform the loop into asm like this
if (!exit_now) { // check once before entering loop
while(1) do_stuff; // infinite loop
}
我断言,没有任何其他 ISA 的 C + + 实现在具有非一致性缓存的核之间运行 std::thread。我没有证据证明不存在这样的实现,但似乎不太可能。除非您的目标是某个特定的异国情况的 HW,否则您对性能的考虑应该假设所有线程之间具有类似 MESI 的缓存一致性。(尽管如此,最好以保证正确性的方式使用 atomic<T>!)