使用pthread,在C语言中,如何初始化一个静态的互斥锁数组?
对于单个静态互斥锁,似乎可以使用PTHREAD_MUTEX_INITIALIZER。但是对于它们的静态数组呢?例如:
#include <pthread.h> #define NUM_THREADS 5
/* 初始化静态互斥锁数组 */ static pthread_mutex_t mutexes[NUM_THREADS] = ...?
它们必须动态分配内存吗?
使用pthread,在C语言中,如何初始化一个静态的互斥锁数组?
对于单个静态互斥锁,似乎可以使用PTHREAD_MUTEX_INITIALIZER。但是对于它们的静态数组呢?例如:
#include <pthread.h> #define NUM_THREADS 5
/* 初始化静态互斥锁数组 */ static pthread_mutex_t mutexes[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
展开后是一个十进制整数常量,可以被预处理器看到,并且不太大即可。
NUM_THREADS
并不是必要的。它可能有助于捕获某些错误,但也可能会导致其他一些错误。 - rlibby