2011-07-24 5 views
1

マニュアルページによると、pthread_cond_broadcastは、条件変数(condvar)を待機しているすべてのスレッドを起動します。そしてそれらの目覚めたスレッドは、mutexロックを保持し、からpthread_cond_waitに戻ります。マルチスレッドpthread_cond_waitは、ミューテックスロックを起こして保持します

しかし私が混乱しているのは、ミューテックスロックが同時に1つのスレッドだけで保持されるのではないかということです。

ありがとうございます。

答えて

2

条件変数は次のように動作します:

/* Lock a mutex. */ 
pthread_mutex_lock(&mtx); 

/* Wait on condition variable. */ 
while (/* condition *.) 
    pthread_cond_wait(&cond, &mtx); 

/* When pthread_cond_wait returns mtx is atomically locked. */ 

/* ... */ 

/* Unlock the mutex. */ 
pthread_mutex_unlock(&mtx); 

だから、理解するための主なポイントは、ブロードキャストが送信されたとき、多くのスレッドが目を覚ますことができますが、は一つだけのレースを「勝利」と実際にロックするということですmtxとループから抜け出す。

+0

cnicutar:これは**スレッド**がpthread_cond_wait()から戻ることを意味し、他のスレッドはブロックされたままであることを意味します。私は正しい? –

+0

@Martin Ng他のスレッドはブロックされたままです。 – cnicutar

+3

@Martin:一度に1つのスレッド*だけが 'pthread_cond_wait()'コール(ミューテックスを保持するもの)から戻ることになります。ミューテックスが解放されると、他のものが(1つずつ)戻ります。 'while'ループから抜けるかどうかは、条件が真のままであるか、最初の(または後続の)スレッドによってfalseになるかによって決まります。 –

関連する問題