1
bool flag=false;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

void function1()
{
    pthread_mutex_lock(&mutex);
    while(!flag)
    {
    //#2
        pthread_cond_wait(&cond,&mutex);
    }
    pthread_mutex_unlock(&mutex);
}

void function2()
{
    flag=true;
    pthread_cond_signal(&cond);
}

これが状況です。2 つのスレッド (thread1 と thread2) がそれぞれ function1 と function2 で実行されています。

CPU スケジュールのため、スレッド 1 は #2 で停止します。

thread2 が実行を開始し、フラグを true に変更しました。

thread1 は待機を開始しますが、永遠に待機します。

ミューテックスをロックせずに他のスレッドに通知したい場合に、この状況を回避する方法。

4

2 に答える 2

4

これが、述語 ( ) を更新するときにミューテックスをロックする必要がある理由ですflag。代替手段はありません。

pthread_mutex_lock(&mutex);
flag = true;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);

(必要に応じて、pthread_cond_signal()後に移動できpthread_mutex_unlock()ます)。

于 2013-08-01T04:59:15.223 に答える