【问题标题】:Static pthreads mutex initialization静态 pthreads 互斥初始化
【发布时间】:2011-07-05 13:22:56
【问题描述】:

使用 pthreads,如何在 C 中初始化一个静态互斥体数组?

对于单个静态互斥体,我似乎可以使用 PTHREAD_MUTEX_INITIALIZER。但是它们的静态数组呢?例如,

#include &ltpthread.h&gt #define NUM_THREADS 5 /*初始化静态互斥数组*/ 静态 pthread_mutex_t 互斥[NUM_THREADS] = ...?

还是必须动态分配?

【问题讨论】:

    标签: c pthreads mutex static-initialization


    【解决方案1】:

    如果您有符合 C99 的编译器,您可以使用 P99 进行初始化:

    static pthread_mutex_t mutexes[NUM_THREADS] =
      { P99_DUPL(NUM_THREADS, PTHREAD_MUTEX_INITIALIZER) };
    

    这只是重复令牌序列PTHREAD_MUTEX_INITIALIZER,请求的次数。

    为此,您只需确保NUM_THREADS 不会扩展为变量,而是扩展为预处理器可见且不太大的十进制整数常量。

    【讨论】:

      【解决方案2】:

      不,您不必动态创建它们。您可以使用静态数组,您只需在使用它们之前将它们全部设置好。你可以这样做:

      #define NUM_THREADS 5
      static pthread_mutex_t mutexes[NUM_THREADS] = {
          PTHREAD_MUTEX_INITIALIZER,
          PTHREAD_MUTEX_INITIALIZER,
          PTHREAD_MUTEX_INITIALIZER,
          PTHREAD_MUTEX_INITIALIZER,
          PTHREAD_MUTEX_INITIALIZER
      };
      

      如果您更改 NUM_THREADS,这很容易出错,但可以通过以下方式修复:

      static pthread_mutex_t mutexes[] = {
          PTHREAD_MUTEX_INITIALIZER,
          PTHREAD_MUTEX_INITIALIZER,
          PTHREAD_MUTEX_INITIALIZER,
          PTHREAD_MUTEX_INITIALIZER,
          PTHREAD_MUTEX_INITIALIZER
      };
      #define NUM_THREADS (sizeof(mutexes)/sizeof(*mutexes))
      

      或者,您可以使用代码来完成,例如:

      #define NUM_THREADS 5
      static pthread_mutex_t mutexes[NUM_THREADS];
      
      // Other stuff
      
      int main (void) {
          for (int i = 0; i < NUM_THREADS; i++)
              pthread_mutex_init(&mutexes[i], NULL);
          // Now you can use them safely.
      
          return 0;
      }
      

      在所有这些情况下,在您尝试使用它们之前,它们都已正确设置。事实上,在你做任何任何线程的事情之前,我会做得很好,但这只是我偏执。

      【讨论】:

      • 在第一个示例中,不需要使用NUM_THREADS。它可以帮助您捕获某些错误,但也可以帮助您提交某些其他错误。
      • 你也可以使用 BOOST_PP_ENUM 因为它只需要 c99 预处理器
      猜你喜欢
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多