18

pthreads を使用して、C でミューテックスの静的配列を初期化するにはどうすればよいでしょうか?

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

#include <pthread.h>
#定義 NUM_THREADS 5

/*静的ミューテックス配列を初期化します*/
static pthread_mutex_t ミューテックス[NUM_THREADS] = ...?

それとも動的に割り当てる必要がありますか?

4

2 に答える 2

25

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

#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;
}

いずれの場合も、使用する前に正しく設定されています。実際、私はあなたがスレッド処理を行う前にそれを行うことをお勧めしますがそれは私が偏執的であることだけです。

于 2011-02-28T06:19:43.780 に答える
17

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

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

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

NUM_THREADSこれが機能するためには、 が変数に展開されず、プリプロセッサに表示され、大きすぎない 10 進整数定数に展開されることを確認する必要があるだけです。

于 2011-02-28T08:01:38.427 に答える