在多线程间共享变量的声明

4

这是一个非常普遍的面试问题:如何在C++中声明一个变量,以供不同的线程使用?(或类似的问题)。我曾认为 'volatile int x;' 是答案,但从一些评论中看到这并不正确。我对以下两点感兴趣:

  • 正确答案是什么
  • 为什么过去认为 volatile 是正确的,但现在不是..

3
“volatile” 在任何时候都不是正确的。 - πάντα ῥεῖ
这取决于软件的要求,但您可以创建一个原子变量或根据数据本身(以及使用情况)使用互斥锁进行保护。 - Jose Palma
2个回答

5
什么是正确答案。
std::atomic<int> x;

过去认为使用 volatile 是正确的,但现在不再认为是正常的。根据 C++ 标准,它从来就没有是正确的。在 C++11 之前,标准根本没有提到线程;C++11 通过添加原子类型(和类似于 std::mutex 的基元)来支持同步,而不是通过改变 volatile 或其他现有语言特性的含义。
某些流行的编译器决定,volatile 应该导致跨线程访问被同步,以及其标准含义。其他编译器不提供这种扩展,因此您不能可移植地依赖它。

3
那是哪个编译器? - 2501

0

volatile从来不是这个问题的正确答案。 volatile关键字向编译器提供了一个指示,表明变量可能在使用之间发生变化。因此,虽然多线程应用程序可以这样做,但在微控制器上进行端口映射变量等其他情况也可能如此。

重要的是,编译器不会保护对变量的访问,而只是避免了任何假设变量在访问之间保持不变的优化。

对于您的目的,std :: atomic <Type>是一个更好的答案,尽管在面试中了解重要因素是线程间访问由锁定防护控制,可以防止不同线程同时进行读/写或写/写访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接