静态pthread互斥量初始化

18

使用pthread,在C语言中,如何初始化一个静态的互斥锁数组?

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

#include <pthread.h>
#define NUM_THREADS 5
/* 初始化静态互斥锁数组 */ static pthread_mutex_t mutexes[NUM_THREADS] = ...?

它们必须动态分配内存吗?

2个回答

25

不需要动态创建数组,可以使用静态数组,只需要在使用之前将其全部设置好即可。可以这样做:

#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并不是必要的。它可能有助于捕获某些错误,但也可能会导致其他一些错误。 - rlibby
你也可以使用BOOST_PP_ENUM,因为它只需要C99预处理器。 - Anycorn

17

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

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

这个代码段会重复输出PTHREAD_MUTEX_INITIALIZER的令牌序列指定的次数。

要让它正常运作,你只需要确保NUM_THREADS展开后是一个十进制整数常量,可以被预处理器看到,并且不太大即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接