【问题标题】:C where to define a mutex in a multithread program?C在多线程程序中在哪里定义互斥锁?
【发布时间】:2012-06-18 21:01:53
【问题描述】:

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

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

互斥量的声明为:

  pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

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

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

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

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

【问题讨论】:

    标签: c multithreading unix mutex semaphore


    【解决方案1】:

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

    extern pthread_mutex_t mutex1;
    

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这是我的疑问!我以为每次我创建一个新线程时,它都会重置互斥锁,这是个好消息。非常感谢!
      • 互斥锁不是在编译时初始化的吗?因此,当您加载代码时,它已经初始化并且没有调用任何函数,不是吗?
      【解决方案3】:

      如果您必须有一个全局变量并在“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
      

      【讨论】:

      • 好的,我明白你的意思。让我看看结果如何。感谢您的建议!
      • 我认为GLOBAL 的游戏没有多大作用,在这里。您需要在.h 文件中声明和在.c带初始化 的定义。 pthread_mutex_t 的默认初始化不会这样做。
      • @JensGustedt 这正是我刚刚所做的并且它奏效了。我没有注意到我正在初始化 .h 文件中的互斥锁。大错特错。
      猜你喜欢
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      相关资源
      最近更新 更多