使用 pthreads,如何在 C 中初始化一个静态互斥体数组?
对于单个静态互斥锁,我似乎可以使用 PTHREAD_MUTEX_INITIALIZER。但是它们的静态数组呢?例如,
#include <pthread.h> #define NUM_THREADS 5 /*初始化静态互斥数组*/ 静态 pthread_mutex_t 互斥[NUM_THREADS] = ...?
还是必须动态分配?
使用 pthreads,如何在 C 中初始化一个静态互斥体数组?
对于单个静态互斥锁,我似乎可以使用 PTHREAD_MUTEX_INITIALIZER。但是它们的静态数组呢?例如,
#include <pthread.h> #define NUM_THREADS 5 /*初始化静态互斥数组*/ 静态 pthread_mutex_t 互斥[NUM_THREADS] = ...?
还是必须动态分配?
不,您不必动态创建它们。您可以使用静态数组,您只需在使用它们之前将它们全部设置好。你可以做:
#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;
}
在所有这些情况下,在您尝试使用它们之前,它们都已正确设置。事实上,在你做任何线程操作之前,我会做得很好,但这只是我偏执。
如果您有符合 C99 的编译器,则可以使用P99进行初始化:
static pthread_mutex_t mutexes[NUM_THREADS] =
{ P99_DUPL(NUM_THREADS, PTHREAD_MUTEX_INITIALIZER) };
这只是将令牌序列重复PTHREAD_MUTEX_INITIALIZER,
请求的次数。
为此,您只需确保它NUM_THREADS
不会扩展为变量,而是扩展为预处理器可见且不太大的十进制整数常量。