静态pthreads互斥初始化

时间:2011-02-28 06:09:07

标签: c pthreads mutex static-initialization

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

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

#include <pthread.h>
#define NUM_THREADS 5

/*initialize static mutex array*/
static pthread_mutex_t mutexes[NUM_THREADS] = ...?

或者必须动态分配吗?

2 个答案:

答案 0 :(得分:22)

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

#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;
}

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

答案 1 :(得分:17)

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

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

这只是重复令牌序列PTHREAD_MUTEX_INITIALIZER,所需的次数。

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