Man*_*Row 18 c mutex pthreads 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] = ...?
或者必须动态分配?
pax*_*blo 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
};
Run Code Online (Sandbox Code Playgroud)
如果你有变化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))
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用代码执行此操作,例如:
#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;
}
Run Code Online (Sandbox Code Playgroud)
在所有这些情况下,在您尝试使用它们之前,它们已正确设置.事实上,在你做任何线程之前我会做得很好,但那只是我的偏执狂.
Jen*_*edt 17
如果您有符合C99标准的编译器,您可以使用P99进行初始化:
static pthread_mutex_t mutexes[NUM_THREADS] =
{ P99_DUPL(NUM_THREADS, PTHREAD_MUTEX_INITIALIZER) };
Run Code Online (Sandbox Code Playgroud)
这只是重复令牌序列PTHREAD_MUTEX_INITIALIZER,所要求的次数.
为此,您只需要确保NUM_THREADS不会扩展为变量,而是扩展到预处理器可见且不会太大的十进制整数常量.
| 归档时间: |
|
| 查看次数: |
38871 次 |
| 最近记录: |