volatile中的c ++:我应该定义一个变量,它可能会被多个线程更改为volatile吗?

时间:2013-11-20 12:54:31

标签: c++ multithreading volatile

我有一个在几个线程之间共享的变量(假设有适当的同步方法)。

我应该将变量定义为volatile?

我要问的原因是:以下任何一个都可以作为答案:

是:因为变量可以由线程更改而其他线程应该知道它。

否:由于编译器可以理解变量的值在CPU内存上并且哪个线程想要读取它并不重要,编译器会处理它。

3 个答案:

答案 0 :(得分:3)

如果您有适当的同步,则无需volatile

如果您没有适当的同步,那么volatile不能提供合适的同步,尽管在某些C ++实现中它似乎有助于或多或少的帮助。

答案 1 :(得分:0)

通常,只有在库API需要时才使用volatile(例如Windows上的原子操作)。

在非常低级别的编程中存在处理可能需要volatile的硬件的情况。

答案 2 :(得分:0)

对于多线程应用程序编程,

volatile(几乎)无用。它旨在与内存映射硬件连接时使用。尽管C ++标准在变量的获取或释放语义方面没有提及volatile,但某些特定平台确实会为volatile添加额外的功能或限制。例如,在Windows 2010中(至少)Acquire和Release语义确实适用于volatile变量上的某些操作:

  

Microsoft特定

     

在某些优化中不使用声明为volatile的对象   因为他们的价值观可以随时改变。系统总是读取   在请求点处的volatile对象的当前值,   即使先前的指令要求来自同一对象的值。   此外,在分配时立即写入对象的值。   优化时,编译器必须维护引用之间的顺序   to volatile对象以及对其他全局对象的引用。在   尤其是,

     

对volatile对象的写入(volatile write)具有Release语义;一个   引用在写入之前发生的全局或静态对象   指令序列中的volatile对象将在此之前发生   volatile编译在已编译的二进制文件中。

     

读取volatile对象(volatile read)具有Acquire语义;一个   引用读取后发生的全局或静态对象   之后将发生指令序列中的易失性存储器   在编译的二进制文件中读取volatile。

http://msdn.microsoft.com/en-us/library/12a04hfd%28v=vs.100%29.aspx