【问题标题】:How are globals handled when multiple .c files are involved涉及多个 .c 文件时如何处理全局变量
【发布时间】:2012-09-20 21:06:37
【问题描述】:

我有两个 .c 文件(main.c 和 support.c)。先编译support.c,然后编译main.c并与support.o链接。我在 support.c 中有几个非静态全局变量。

support.c 中的这些全局变量是如何存储的?如果 main.c 是多线程的,并且有两个线程调用 support.c 中的函数,那么它们是共享这些全局变量,还是每个都有自己的副本?

【问题讨论】:

    标签: c parallel-processing


    【解决方案1】:

    一个全局变量是一个全局变量,而且总是只有一个,无论你编译和链接你的程序有多少片段。如果多个线程同时访问全局数据,您需要自己确保正确同步。

    获取全局或块静态变量的单独副本的唯一方法是将其声明为_Thread_local,这是在 C11 中引入的。线程局部全局变量在线程启动时初始化,在线程加入时释放。

    【讨论】:

    • @KingsIndian:标题<threads.h> 定义了一个宏thread_local,但你是对的,_Thread_local 是更自然的关键字。
    【解决方案2】:

    我认为您可能会混淆 static 关键字的用法,它适用于 C 源代码中存在的顶级变量(即在任何函数或方法之外),而不是当您在变量中使用 static 时一个函数或关键字。

    在源代码中在任何函数之外声明的顶级变量将是全局变量除非您将其声明为static。如果是static,它将是该文件的本地only。它控制变量的范围

    如果你在函数中声明static,它控制变量的生命周期。在这种情况下,即使在函数调用退出后,变量也会将自身保留在内存中,从而导致其值在多个函数调用中保持不变。

    如果您声明一个全局变量(即它不是static 并且在源文件中是顶级的),那么在内存中总是只有一个它的实例。在其他源文件中,您必须将其声明为 extern,以便链接器知道根据目标文件中为您的其他文件定义的内存位置查找其内存位置,但内存中只有一个。

    【讨论】:

      【解决方案3】:

      不要忘记将全局变量声明为 volatile,否则编译器可能没有意识到它们可以被另一个线程修改并进行不安全的优化。

      volatile int g_example;

      【讨论】:

        猜你喜欢
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 2019-05-24
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多