C在多线程程序中定义互斥锁的位置?

时间:2012-06-15 18:58:23

标签: c multithreading unix mutex semaphore

我正在开发一个多线程程序,并且对于在何处定义互斥锁有疑问。

相关信息:程序有main.c,我们根据用户输入确定特定操作。 main调用master_function,该master_function位于名为master.c的文件中。在master.c文件中,我们沿着一些其他操作(不相关)创建N个线程。线程调用名为son_threads的函数,该函数位于son.c文件中,当它们进入关键区域时需要使用互斥锁(编辑几个全局变量以防止竞争条件)。我的另一个文件是type.h,我在其中定义了我需要使用的几个全局变量。

互斥的声明是:

  pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

因此,我尝试在type.h中定义互斥锁,以便son.c文件可见。当我尝试编译时,它给了我错误。这是正确的,因为我在几个文件中定义了互斥锁。

但我很确定我无法在son.c文件中定义互斥锁,因为每次创建该线程时,互斥锁都会初始化为默认设置,不允许我正确使用它。对此不确定。

互斥锁必须是一个全局变量,N个线程可以访问它。那么我应该把它放在哪里呢?

我不知道我是否正确解释自己。尽我所能。

3 个答案:

答案 0 :(得分:6)

只需.h文件

中声明您的变量
extern pthread_mutex_t mutex1;

并使用C文件中的初始化保留定义。这与C标准一样。

对于POSIX,使用静态存储初始化互斥锁非常重要。因此,该定义不能存在于.h文件中。

答案 1 :(得分:2)

  

但我很确定我无法在son.c文件中定义互斥锁,因为每次创建该线程时,互斥锁都会被初始化为默认设置,不允许我正确使用它。对此不确定。

这不正确。将互斥锁定义放在该文件中,但在线程函数之外。它将在程序启动时初始化,但不会在每个新线程上初始化。您可以将extern pthread_mutex_t mutex1;放入其中一个头文件中,以便互联网中不在son.c内的任何用户都知道互斥锁。

答案 2 :(得分:1)

如果你必须有一个全局变量并在'C'中的模块之间共享它,我认为通常在包含文件中声明它。在过去,我们会在.h文件中使用像“GLOBAL”这样的神奇宏作为“extern”,并且在主要内容中我们将GLOBAL重新定义为不会在main中声明它。

#ifndef _TYPES_H
#define _TYPES_H

    // types.h

    #ifndef GLOBAL
    #   define GLOBAL extern
    #endif

    GLOBAL my_global mutex;


#endif