11

Linuxプログラミングインターフェイスの本には、条件変数がどのように機能するかを示すコード(プロデューサー/コンシューマー)があります。

static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

static int avail = 0;

while (TRUE) {
    s = pthread_mutex_lock(&mtx);

    while (avail == 0) {   /* Wait for something to consume */
       s = pthread_cond_wait(&cond, &mtx);
    }

    while (avail > 0) {   /* Consume all available units */ 
        avail--;
    }

    s = pthread_mutex_unlock(&mtx);
}

なぜ使用pthread_mutex_lockするのwhileですか?なぜそれを使用しないのifですか?

4

1 に答える 1

13

pthread_cond_signal()は、条件変数で待機している複数のスレッドをウェイクアップすることが許可されているためです。したがって、他のスレッドが目覚め、前に変更した可能性があるため、目覚めたら状態を再確認する必要があります。

待機中のスレッドが1つしかないことがわかっていて、将来、プログラムの他の場所でコードを変更して待機中の別のスレッドを追加する人がいないことが確実な場合は、を使用できますif。しかし、それを確実に知ることはできないので、常にを使用してwhileください。

[アップデート]

ninjaljがコメントで指摘しているように、「偽の目覚め」について言及しなかったため、私の答えは不完全です。たとえば、POSIX標準では、待機中のスレッドがシグナルを受信した場合(たとえば、kill()を介して)、他のスレッドが条件変数にシグナルを送信していなくても、pthread_cond_wait()は0を返すことができることを明確にしています。(私の見解では)待機中のスレッドを理由もなくウェイクアップできるかどうかについての標準はあいまいです...しかし、結論は次のとおりです。常にwhileではなく、を使用しますif

于 2011-06-01T19:17:54.513 に答える