繁体   English   中英

线程之间共享的变量的声明

[英]Declaratiaion of a variable shared between threads

相当常见的面试问题:如何在C ++中声明一个由不同线程使用的变量? (或类似的东西)。 我以为'volatile int x;' 是答案,但我从一些评论中看到这是不正确的。 我对两者都感兴趣:

  • 什么是正确的答案
  • 为什么volatile在过去被认为是正确的(?)而不是现在..

什么是正确的答案

std::atomic<int> x;

为什么volatile在过去被认为是正确的(?)而不是现在

根据C ++标准,它永远不会正确。 在C ++ 11之前,标准根本没有提到线程; C ++ 11通过添加原子类型(和std::mutex等原语)来支持同步,而不是通过更改volatile或其他现有语言功能的含义。

一个流行的编译器决定volatile应该导致跨线程同步访问,以及它的标准含义。 其他编译器不提供该扩展,因此它不是您可以依赖的东西。

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

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

出于您的目的, std::atomic<Type>是一个更好的答案,尽管在面试情况下可能更好地理解重要因素是线程间访问由锁定控制器控制,防止同时读/写或写入/写入不同的线程访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM