当涉及多个.c文件时,如何处理全局变量

时间:2012-09-20 21:06:38

标签: c parallel-processing

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

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

3 个答案:

答案 0 :(得分:5)

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

获取全局或块静态变量的单独副本的唯一方法是将其声明为_Thread_local,这是在C11中引入的。线程本地全局变量在线程启动时初始化,并在线程连接时解除分配。

答案 1 :(得分:1)

我认为当static关键字应用于C源中存在顶级变量(即在任何函数或方法之外)时,使用static时,可能会混淆static关键字的使用}关于函数或关键字中的变量。

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

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

如果声明一个全局变量(即它不是extern并且是源文件中的顶级变量),则内存中始终只有一个实例。在其他源文件中,您必须将其声明为{{1}},以便链接器知道查找其他文件的目标文件中定义的内存位置,但内存中只有一个。< / p>

答案 2 :(得分:0)

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

volatile int g_example;