【发布时间】:2011-11-14 06:25:18
【问题描述】:
可能重复:
Using C/Pthreads: do shared variables need to be volatile?
在 Linux/C 中:线程之间共享的全局变量是否需要声明为 volatile(假设变量在其中一个线程中被修改)?
在哪些情况下我需要在线程中将变量声明为 volatile?
【问题讨论】:
标签: c linux multithreading
可能重复:
Using C/Pthreads: do shared variables need to be volatile?
在 Linux/C 中:线程之间共享的全局变量是否需要声明为 volatile(假设变量在其中一个线程中被修改)?
在哪些情况下我需要在线程中将变量声明为 volatile?
【问题讨论】:
标签: c linux multithreading
如果您使用的是 pthreads,那么没有 - volatile 对于正确的同步既不是必要的也不是充分的。如果您对全局变量的访问受到互斥锁(或其他同步原语)的适当保护,那么您可以简单地将它们声明为普通变量。
【讨论】:
有时最好将数据声明为 volatile(主要是在它是原子的并且由原子操作操作的情况下)。但使用同步机制(如互斥锁、rwlocks...)来序列化对全局数据的访问非常重要。
使用 volatile 的真正原因很少见:例如当变量是一个整数,当你对它使用特殊的原子操作时。
您需要使用同步原语,因为例如缓存
【讨论】:
我看到有人说当你使用 pthreads 时没有必要。 我不确定 pthread 如何保护这种情况,但据我所知,这很重要 如果您在多线程环境中,请将全局变量定义为“volatile”, 原因就像上面的 myrkos 所说,多线程环境是变量可以 被“外部”修改。现代编译做的优化比你想象的要多,它会 如果它认为变量没有被修改,则使代码不会从内存中读取值,但是在这样的环境中,变量可能会改变。
但是让全局变量很好地工作是不够的,你需要使用自动操作或 互斥锁来保护它。
【讨论】:
Volatile 只是告诉编译器变量可以从外部修改,因此它不应该对其进行任何优化(跳过读/写,放入寄存器)。因此,如果要在多个线程中使用全局变量 volatile,则应始终声明它。
【讨论】: