相当常见的面试问题: 你如何在C ++中声明一个由不同线程使用的变量? (或类似的东西)。我以为'volatile int x;'是答案,但我从一些评论中看到这是不正确的。我对两者都感兴趣:
答案 0 :(得分:5)
什么是正确答案
std::atomic<int> x;
为什么volatile在过去被认为是正确的(?)而不是现在
根据C ++标准,它永远不会正确。在C ++ 11之前,标准根本没有提到线程; C ++ 11通过添加原子类型(以及std::mutex
等原语)来支持同步,而不是通过更改volatile
或其他现有语言功能的含义。
一个流行的编译器认为volatile
应该导致跨线程同步访问,以及它的标准含义。其他编译器不提供该扩展,因此它不是您可以依赖的东西。
答案 1 :(得分:0)
volatile
从来都不是这个问题的正确答案。 volatile
关键字向编译器指示变量可能在两次使用之间发生变化。因此,虽然多线程应用程序可以执行此操作,但其他情况也是如此,例如微控制器上的端口映射变量。
重要的是,编译器不会保护对变量的访问,而只是避免任何假设变量在访问之间保持相同的优化。
出于您的目的,std::atomic<Type>
是一个更好的答案,尽管在面试情况下可能更好地理解重要因素是线程间访问由锁定控制器控制,防止同时读/写或不同线程的写/写访问。