【问题标题】:C/gcc : global variables shared between threads need to be volatile? [duplicate]C/gcc:线程之间共享的全局变量需要是易失的? [复制]
【发布时间】:2011-11-14 06:25:18
【问题描述】:

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

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

在哪些情况下我需要在线程中将变量声明为 volatile?

【问题讨论】:

    标签: c linux multithreading


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        但是让全局变量很好地工作是不够的,你需要使用自动操作或 互斥锁来保护它。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2014-08-07
            • 2019-03-23
            • 1970-01-01
            • 2010-11-23
            • 1970-01-01
            • 2015-03-28
            • 2015-06-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多