web-dev-qa-db-ja.com

静的pthreadsミューテックスの初期化

Cでpthreadを使用して、ミューテックスの静的配列をどのように初期化しますか?

単一の静的ミューテックスの場合、PTHREAD_MUTEX_INITIALIZERを使用できるようです。しかし、それらの静的配列はどうですか?たとえば、

#include&ltpthread.h> 
#define NUM_THREADS 5 
 
/* initialize static mutex array */
 static pthread_mutex_t mutexes [NUM_THREADS] = ...?

または、動的に割り当てなければなりませんか?

18
ManRow

C99準拠のコンパイラーがある場合は、 P99 を使用して初期化を行うことができます。

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

これは単にトークンシーケンスを繰り返すPTHREAD_MUTEX_INITIALIZER,要求された回数。

これが機能するためには、NUM_THREADSは変数に展開されませんが、プリプロセッサから見える10進整数定数に展開されます。これは大きすぎません。

17
Jens Gustedt

いいえ、動的に作成する必要はありません。静的配列を使用できます。使用する前に、すべてをセットアップする必要があります。できるよ:

#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スレッドのようなものですが、それは私が偏執的であることだけです。

22
paxdiablo