パスワードを忘れた? アカウント作成
452085 journal

Silphireの日記: pthread日記(54) - pthread_cond_wait() 2

日記 by Silphire

条件変数がある状態に遷移するまでブロックします

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

pthread_cond_wait()は、condが参照する条件変数を使ってブロックします。この関数は呼び出す側がロックしたMutexをmutexに指定して呼び出さねばなりません。そうしなかった時の動作は未定義です。

pthread_cond_wait()はアトミックにmutexをアンロックし、呼び出したスレッドを条件変数でブロックします。アトミックとは、ここでは「他のスレッドによって、Mutexや条件変数にアクセスされる事に関してアトミックである」という事を指します。つまり、もしブロック処理中のスレッドが、Mutexをアンロックした後に、他のスレッドがMutexを取得出来るとすると、次のpthread_cond_signal()やpthread_cond_broadcast()の呼び出しは、呼び出し元のスレッドが、あたかもブロック処理中のスレッドがブロックした後に行われたかのようにふるまうという事です。

成功すると、Mutexはロックされて呼び出したスレッドの物となります。

条件変数を使う時には常に、条件ウェイトと結びつけられた共有変数に関するブール値を返す述語があります。スレッドの実行が続いていれば、その述語は真を返します。pthread_cond_wait()やpthread_cond_timedwait()からの他のスレッドによる望まれない呼び出しが起こる可能性もあります。pthread_cond_wait()やpthread_cond_timedwait()からのリターンはこの述語からの戻り値を含まないので、述語はこのようなリターンを再評価すべきです。

1つ以上のMutexを同じ条件変数へのpthread_cond_wait()やpthread_cond_timedwait()の処理に使う事の結果は未定義です。つまり、条件変数でスレッドを待つ時には、1つの条件変数はただ1つのMutexに拘束され、ウェイトが終わった時にこの関連づけは終了するという事です。

条件ウェイトは(timedにせよどちらにせよ)キャンセルポイントです。スレッドのキャンセル許可状態がPTHREAD_CANCEL_DEFERREDにセットされている時、条件ウェイト中のキャンセル要求に作用している副作用は、最初の「キャンセルの後処理ハンドラ」(cancellation cleanup handler)の呼び出しの前にMutexが(事実上)再取得される事です。この結果は、スレッドがアンブロックし、pthread_cond_wait()やpthread_cond_timedwait()が終了する時点まで実行を許可していたかに見えます。しかしその時キャンセル要求が通告され、pthread_cond_wait()やpthread_cond_timedwait()の呼び出し元に戻る代わりに、スレッドをキャンセルする活動が始まります。それにはキャンセルの後処理ハンドラの呼び出しも含まれます。

pthread_cond_wait()やpthread_cond_timedwait()の呼び出しでブロックしている間に、キャンセルされた事によってアンブロックされたスレッドは、条件シグナルを一切消費しません。他のスレッドが条件変数上でブロックされると、条件変数に同時に向けられるかもしれない条件シグナルを消費しません。

もし条件変数を待っているスレッドにシグナルが通告されたら、シグナルハンドラから戻る所で、スレッドは割り込みが無かったかのように条件変数の待ちを再開します。あるいは他のスレッドによる望まれない呼び出しの為に0を返します。

ETIMEDOUTの場合を除いて、全てのエラーチェックは関数の実行の最初、実質的にはmutexで指定されたMutexかcondで指定された条件変数の状態を変更する前に直接行われたかのように実行され、エラー終了します。

pthread_cond_wait()が成功した時には0を返します。エラーの時はエラーに応じた値を返します。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2003年03月10日 0時32分 (#275662)
    こんなに長い一文、初めて見た。

    A thread that has been unblocked because it has been canceled while blocked in a call to pthread_cond_wait() or pthread_cond_timedwait() does not consume any condition signal that may be directed concurrently at the condition variable if there are other threads blocked on the condition variable.
typodupeerror

192.168.0.1は、私が使っている IPアドレスですので勝手に使わないでください --- ある通りすがり

読み込み中...