6

我正在开发一个多线程程序,并且有一个关于在哪里定义互斥锁的问题。

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

互斥量的声明是:

  pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

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

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

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

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

4

3 回答 3

8

只需在文件中声明您的变量.h

extern pthread_mutex_t mutex1;

并将定义与 C 文件中的初始化一起保留。这与 C 标准的含义相同。

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

于 2012-06-15T19:28:30.037 回答
2

但是我很确定我不能在son.c文件中定义互斥锁,因为每次我创建那个线程时,互斥锁都会被初始化为其默认设置,不允许我正确使用它。不确定这一点。

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

于 2012-06-15T19:24:16.297 回答
1

如果您必须有一个全局变量并在“C”中的模块之间共享它,我认为通常在包含文件中声明它。在过去,我们会在 .h 文件中使用像“GLOBAL”这样的魔术宏作为“extern”,而在 main 中,我们会将 GLOBAL 重新定义为什么都没有,这样它就会在 main 中声明。

#ifndef _TYPES_H
#define _TYPES_H

    // types.h

    #ifndef GLOBAL
    #   define GLOBAL extern
    #endif

    GLOBAL my_global mutex;


#endif
于 2012-06-15T19:04:22.643 回答