C / gcc:线程之间共享的全局变量需要是volatile吗?

时间:2011-11-14 06:25:18

标签: c linux multithreading

  

可能重复:
  Using C/Pthreads: do shared variables need to be volatile?

在Linux / C中:线程之间共享的全局变量是否需要声明为volatile(假设变量在其中一个线程中被修改)?

我需要在线程中将变量声明为volatile是什么情况?

4 个答案:

答案 0 :(得分:4)

如果您正在使用pthread,那么没有 - volatile既不必要也不足以进行正确的同步。如果您对全局变量的访问受到互斥(或其他同步原语)的适当保护,那么您可以简单地将它们声明为普通变量。

答案 1 :(得分:0)

有时最好将数据声明为易失性(主要是在它是原子的情况下并且由原子操作操作)。但是使用同步机制(如互斥锁,rwlocks,...)来序列化对全局数据的访问非常重要。

使用volatile的真正原因很少见:当变量是例如一个整数,当你对它使用特殊的原子操作时。

您需要使用同步原语,例如缓存

答案 2 :(得分:0)

我看到有人说你在使用pthreads时没有必要。 我不确定pthread如何保护这种情况,但据我所知,它很重要 如果您处于多线程环境中,则将全局变量定义为“volatile”, 原因就像myrkos上面说的那样,多线程env就是变量可以的情况 被“外部”修改。现代编译比你想象的更优化,它会 如果认为变量未被修改,则使代码不从内存中读取值,但是在这样的环境中变量可能会改变。

但要使全局变量运行良好还不够,你需要使用自动操作或 互斥保护它。

答案 3 :(得分:-1)

Volatile只是告诉编译器,而不是变量可以从外部修改,所以它不应该对它进行任何优化(跳过读/写,放入寄存器)。因此,如果要使用多个线程,则应始终声明全局变量volatile。