Cでpthreadを使用して、ミューテックスの静的配列をどのように初期化しますか?
単一の静的ミューテックスの場合、PTHREAD_MUTEX_INITIALIZERを使用できるようです。しかし、それらの静的配列はどうですか?たとえば、
#include&ltpthread.h> #define NUM_THREADS 5 /* initialize static mutex array */ static pthread_mutex_t mutexes [NUM_THREADS] = ...?
または、動的に割り当てなければなりませんか?
C99準拠のコンパイラーがある場合は、 P99 を使用して初期化を行うことができます。
static pthread_mutex_t mutexes[NUM_THREADS] =
{ P99_DUPL(NUM_THREADS, PTHREAD_MUTEX_INITIALIZER) };
これは単にトークンシーケンスを繰り返すPTHREAD_MUTEX_INITIALIZER,
要求された回数。
これが機能するためには、NUM_THREADS
は変数に展開されませんが、プリプロセッサから見える10進整数定数に展開されます。これは大きすぎません。
いいえ、動的に作成する必要はありません。静的配列を使用できます。使用する前に、すべてをセットアップする必要があります。できるよ:
#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;
}
これらのすべてのケースで、使用する前に正しく設定されています。実際、私はあなたがする前にそれをうまくやるanyスレッドのようなものですが、それは私が偏執的であることだけです。