我正在开发一个多线程程序,并且对于在何处定义互斥锁有疑问。
相关信息:程序有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个线程可以访问它。那么我应该把它放在哪里呢?
我不知道我是否正确解释自己。尽我所能。
答案 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