这是一个非常普遍的面试问题:如何在C++中声明一个变量,以供不同的线程使用?(或类似的问题)。我曾认为 'volatile int x;' 是答案,但从一些评论中看到这并不正确。我对以下两点感兴趣:
- 正确答案是什么
- 为什么过去认为 volatile 是正确的,但现在不是..
这是一个非常普遍的面试问题:如何在C++中声明一个变量,以供不同的线程使用?(或类似的问题)。我曾认为 'volatile int x;' 是答案,但从一些评论中看到这并不正确。我对以下两点感兴趣:
std::atomic<int> x;
volatile
从来不是这个问题的正确答案。 volatile
关键字向编译器提供了一个指示,表明变量可能在使用之间发生变化。因此,虽然多线程应用程序可以这样做,但在微控制器上进行端口映射变量等其他情况也可能如此。
重要的是,编译器不会保护对变量的访问,而只是避免了任何假设变量在访问之间保持不变的优化。
对于您的目的,std :: atomic <Type>
是一个更好的答案,尽管在面试中了解重要因素是线程间访问由锁定防护控制,可以防止不同线程同时进行读/写或写/写访问。