可能重复:
Using C/Pthreads: do shared variables need to be volatile?C/gcc:线程间共享的全局变量需要变化吗?
在Linux中/ C:在线程之间共享的全局变量需要声明挥发性(假设变量得到一个线程修改)?
我需要在线程中声明一个变量为volatile的所有情况?
可能重复:
Using C/Pthreads: do shared variables need to be volatile?C/gcc:线程间共享的全局变量需要变化吗?
在Linux中/ C:在线程之间共享的全局变量需要声明挥发性(假设变量得到一个线程修改)?
我需要在线程中声明一个变量为volatile的所有情况?
如果您正在使用pthreads,则不需要 - volatile
对于正确的同步既不必要也不足够。如果你对全局变量的访问被一个互斥体(或另一个同步原语)正确保护,那么你可以简单地将它们声明为普通变量。
有时候最好将数据声明为volatile(大多数情况下是原子操作并且由原子操作操作)。但使用同步机制(如互斥锁,rwlocks等)来序列化对全局数据的访问是非常重要的。使用volatile的真正原因很少见:当变量是例如一个整数,当你使用特殊的原子操作时。
您需要使用同步原语,例如,的缓存
易失性只是告诉编译器,而不是变量可以从外部的东西修改,所以它不应该做任何优化(跳过读/写,放入寄存器)。所以你应该总是声明一个全局变量volatile,如果多线程要使用它。
我看到有人说当你使用pthreads时没有必要这么做。 我不知道pthread如何保护这种情况,但据我所知, 定义一个全局变量为“volatile”,如果你在多线程环境中, 原因就像myrkos上面所说的,多线程环境是变量可以“外部”修改的情况。现代编译做了比你想象的更多的优化,如果它认为变量没有被修改, 会使代码不从内存读取值,但是在这样的env中变量可能会改变。
但是,使全局变量运行良好还不够,您需要使用自动操作或 互斥锁来保护它。