1

pthread が待機する前に、mutex を使用してロックし、他のコードが条件変数を変更しようとしないようにします。次に、mutex のロックを解除し、シグナルを待ちます。

たとえば、他のスレッドで同じミューテックスをロックし、その後「シグナル」を使用したとします。スレッドのロックを解除します。シグナルが完了すると、待機中のスレッドが起動し、ミューテックスを再度取得します。

Thread1                   Thread2
{                         {
    lock(mutex);               lock(mutex);
    wait(mutex);               signal(mutex);
    unlock(mutex);             unlock(mutex);
}                          }

3 つのスレッド 1 ステートメントが while(1) ループで囲まれているとします。次に、スレッド 2 がミューテックスをロックし、それを通知して、ミューテックスをロック解除するとします。そして終わらず眠りにつく。

では、条件変数の値は永続的に変更されるのでしょうか? スレッド 1 の 3 つのステートメントが無限ループで実行されている場合、待機することはなく、シグナルが与えられたことを検出するだけでしょうか? 待機呼び出しが戻ったときに、条件変数の値を初期値に戻しますか?

はいの場合、変数に対して create、destroy、または initialize メソッドを使用して値を元に戻すことはできますか? はいの場合、どのように?これらの関数は正確に何をしますか?

ありがとう、

4

1 に答える 1

1

pthread_cond_signal()は、その条件変数で現在待機している少なくとも 1 つのスレッドを常に起動しますpthread_cond_wait()。同じスレッドまたは別のスレッドがpthread_cond_wait()再度呼び出すと、ブロックされて別のシグナルを待ちます。

つまり、pthread 条件変数は、呼び出し時に保持されるミューテックスによって保護された、ある種の共有データと常にペアにする必要がありますpthread_cond_wait()。を呼び出す前pthread_cond_wait()に、スレッドは共有データをチェックして、待ちたい条件が発生したかどうかを確認する必要があります。そうでない場合は、待機するべきではありません。

このような共有データの最も単純な例は、グローバル フラグです。あなたの例では:

int flag = 0;

Thread 1 {
    pthread_mutex_lock(&mutex);
    while (!flag)
        pthread_cond_wait(&cond, &mutex);
    pthread_mutex_unlock(&mutex);
}

Thread 2 {
    pthread_mutex_lock(&mutex);
    flag = 1;
    pthread_mutex_signal(&cond);
    pthread_mutex_unlock(&mutex);
}

ここで、条件が「リセット」の場合は完全に制御できることがわかります。たとえば、 を呼び出す前にThread 1設定できます。flag = 0;pthread_mutex_unlock()

共有状態は、多くの場合、単純なフラグよりも複雑です。たとえばpthread_mutex_wait()、共有バッファーに空きがないときにプロデューサー スレッドを呼び出す場合があります。

于 2012-07-30T05:52:16.570 に答える