本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 3 : ライブラリ (N~Z) > p

pthread_cond_wait(3T)

pthread ライブラリ
HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

pthread_cond_wait(), pthread_cond_timedwait() ― 条件変数に対する待機または一定時間待機

構文

#include <pthread.h> 
 
int pthread_cond_wait( 
   pthread_cond_t *cond, 
   pthread_mutex_t *mutex 
); 
 
int pthread_cond_timedwait( 
   pthread_cond_t *cond, 
   pthread_mutex_t *mutex, 
   const struct timespec *abstime 
); 

パラメータ

cond  

待機する条件変数へのポインター。

mutex  

条件変数 cond に関連付けた mutex へのポインター。

abstime  

条件にシグナルが送られたり、ブロードキャストされなくても待機が時間切れになる絶対時間。

説明

pthread_cond_wait() 関数は、条件変数 cond に関連付けした条件の成立を待つために使用されます。

pthread_cond_timedwait() 関数は、条件変数 cond に関連付けした条件の成立を、時間制限をつけて待つために使用されます。 abstime パラメータは、この関数が時間切れになる時間を指定します。 abstime パラメータで指定された絶対時間を過ぎても、提示した条件がシグナル状態にならなかった場合、関数は呼び出し元にエラーを返します。 注意: abstime は待機が期限切れになる時間であり、スレッドが待機する時間の長さではありません。

cond によって表される条件変数は、 pthread_cond_init() の呼び出しで動的に初期化されるか、マクロ PTHREAD_COND_INITIALIZER で静的に初期化されていなければなりません。

どちらの関数も、呼び出しスレッドによってロックされた mutex を用いて呼び出される必要があります。 mutex が呼び出しスレッドによってロックされていないと、不測の動作が生じます。 これらの関数は、 mutex をアトミックに解放し、条件変数 cond によって呼び出しスレッドをブロックさせます。 ブロックしようとしているスレッドが mutex を解放した後 (ただし実際のブロックはまだ行われない)、別のスレッドが mutex を取得することが可能な場合、それ以後に他のスレッドによって pthread_cond_signal() または pthread_cond_broadcast() の呼び出しが行われると、ブロックしようとしているスレッドがブロックされた後で呼び出しが行われたのと同様の動作になります。

条件にシグナルが送られるか、時間待機が満了すると、呼び出し元のブロックは解除され、戻る前に mutex を再度取得します。 これらの関数は、呼び出しの成否にかかわらず、呼び出し元へ戻る前に必ず mutex が再度取得されます。

同じ条件変数でこれらの関数を同時に呼び出しすために異なる mutex を使用すると、動作は不定になります。

条件変数を使用するときは、各条件待機に関連付けられた論理型の述語を用意します。 この述語が偽の場合、スレッドは条件待機する必要があります。 条件変数で待機しているときには、疑似再開が発生する可能性もあります。 疑似再開は、スレッドが本当は待機を続けなければならないのに、条件待機から戻ってしまうときに発生します。 条件待機しているスレッドへ配信される通常のシグナルは、疑似再開を発生させることがあります。 pthread_cond_wait()pthread_cond_timedwait() からの戻り値は、この述語の値を何も示さないので、必ず述語を再評価する必要があります。

条件待機は、1 つの キャンセルポイント となります。呼び出しスレッドの遅延取り消しが可能な場合、 取り消し要求がキャンセルポイントで実行されます。 これらの関数の 1 つでスレッドがブロックされている間に取り消し要求が作動した場合、 mutex が再度取得され、それから取り消しクリーンアップハンドラーが呼び出されます。 取り消しクリーンアップハンドラーは、アプリケーションでデッドロックを発生させないように mutex を解放する必要があります。 条件シグナルと取り消し要求が両方とも発生する場合、取り消されたスレッドは条件シグナルを消費しません (条件シグナルでは別のスレッドがブロック解除されます)。

条件変数を待つスレッドにシグナルが配送される場合、シグナルハンドラーから戻るとスレッドは、疑似再開のために 0 を返すか、継続して条件を待つ可能性があります。

戻り値

正常終了すると、 pthread_cond_wait()pthread_cond_timedwait() は 0 を返します。 それ以外の場合、エラーの内容を表すエラー番号を返します (errno 変数は使用しません)。

エラー

以下の条件の場合、 pthread_cond_timedwait() 関数は、該当するエラー番号を返します。

[ETIMEDOUT]  

abstime が経過したが条件シグナルが受信されていない場合。

以下の条件の場合、 pthread_cond_wait()pthread_cond_timedwait() 関数は、該当するエラー番号を返します。

[EINVAL] 

condmutex または abstime で指定された値が無効の場合。

mutex は呼び出しスレッドに所有されてはいません。 HP-UX では、 PTHREAD_MUTEX_NO_OWNER_NPPTHREAD_MUTEX_NORMAL または PTHREAD_MUTEX_DEFAULT の mutex においてこのようなエラーは返されません。

[EFAULT] 

condmutex または abstime パラメータが無効なアドレスを指している場合。

[EINVAL] 

異なる mutex が cond に使用されている場合。このエラーは HP-UX では検出されません。

警告

pthread_cond_wait() または pthread_cond_timedwait() がエラーなしで戻ったときでも、関連付けられた述語が偽である可能性に注意することが重要です。 pthread_cond_timedwait() がタイムアウトエラーで戻るとき、関連付けられた述語は真である可能性があります。 述語をチェックする「while ループ」等の中に、条件待機を組み込むことをお推めします。

これらの関数を、 PTHREAD_MUTEX_RECURSIVE の mutex で呼び出すと、動作は不定となります。

pthread_cond_wait() は、それと関連付けられた述語を判定するループで使用するようお推めします。 これにより、発生する可能性のある疑似再開への対処ができます。

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
  
(void)pthread_mutex_lock(&mutex); 
while (predicate == FALSE) { 
    (void)pthread_cond_wait(&cond, &mutex); 
} 
  
(void)pthread_mutex_unlock(&mutex); 

pthread_cond_timedwait() も、ループで使用するようお推めします。 この関数は、述語が真でなくても成功を返すことがあります。 そのため、述語をチェックするループ内で呼び出す必要があります。 時間切れで関数が終了しても、述語は真になっている可能性があります。 時間切れの判定を行う前に、述語のチェックを行ってください。 以下の例では、その他のエラーチェックは何も行っていません。

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
struct timespec abstime; 
 
(void)pthread_mutex_lock(&mutex); 
abstime = absolute time to timeout. 
 
while (predicate == FALSE) { 
        ret = pthread_cond_timedwait(&cond, &mutex, &abstime); 
        if (ret == ETIMEDOUT) { 
                if (predicate == FALSE) { 
                        /* Code for time-out condition */ 
                } else { 
                        /* success condition */ 
                        break; 
                } 
        } 
} 
(void)pthread_mutex_unlock(&mutex); 
 
Code for success condition. 

著者

pthread_cond_wait()pthread_cond_timedwait() は、IEEE POSIX P1003.1c 規格から派生しました。

標準準拠

pthread_cond_wait(): POSIX 1003.1c.
pthread_cond_timedwait(): POSIX 1003.1c.

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.