PTHREAD_COND(3) | FreeBSD Library Functions Manual | PTHREAD_COND(3) |
NAME
pthread_cond_init, pthread_cond_destroy, pthread_cond_signal, pthread_cond_broadcast, pthread_cond_wait, pthread_cond_timedwait -条件変数の操作書式
#include <pthread.h>説明
条件(「条件変数」の省略) は、共有データに対するある述語が満たされるまで、スレッドが実行を停止しプロセッサを手放すことを可能にする同期装置である。条件に対する基本的な操作は、(述語が真になった場合に) 条件を送信することと、他のスレッドが条件を送信するまでスレッドの実行を停止して条件を待つことである。取り消し
pthread_cond_wait および pthread_cond_timedwait は、取り消しポイントである。このいずれかの関数で停止しているスレッドが取り消されると、スレッドは直ちに実行を再開し、 pthread_cond_wait と pthread_cond_timedwait の mutex 引数を再ロックし、最後に取り消しを実行する。結果として、クリーンアップハンドラが呼び出される際に mutex がロックされていることを保証される。非同期シグナルに対する安全性
条件関数は非同期シグナルに対して安全ではない。よって、シグナルハンドラから呼び出すべきではない。特に、 pthread_cond_signal または pthread_cond_broadcast のシグナルハンドラからの呼び出しは、呼び出しスレッドをデッドロックする可能性がある。返り値
全ての条件変数関数は、成功すると 0 を返し、エラーならば非ゼロのエラーコードを返す。エラー
pthread_cond_init, pthread_cond_signal, pthread_cond_broadcast, および pthread_cond_wait は、決してエラーコードを返さない。- ETIMEDOUT
-
条件変数が
abstime で指定された時限までに送信されなかった。
- EINTR
- pthread_cond_timedwait がシグナルによって割り込まれた。
- EBUSY
- いずれかのスレッドが現在 cond に対して待機している。
著者
Xavier Leroy <Xavier.Leroy@inria.fr>関連項目
pthread_condattr_init(3), pthread_mutex_lock(3), pthread_mutex_unlock(3), gettimeofday(2), nanosleep(2).例
二つの共有変数 x と y があって、mutex mut により保護されているとしよう。更に、条件変数 cond があって、 x が y より大きくなれば、送信されるとしよう。int x,y;
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_lock(&mut);
while (x <= y) {
pthread_cond_wait(&cond, &mut);
}
/* x と y の操作 */
pthread_mutex_unlock(&mut);
pthread_mutex_lock(&mut);
/* x と y を変更する */
if (x > y) pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mut);
struct timeval now;
struct timespec timeout;
int retcode;
pthread_mutex_lock(&mut);
gettimeofday(&now);
timeout.tv_sec = now.tv_sec + 5;
timeout.tv_nsec = now.tv_usec * 1000;
retcode = 0;
while (x <= y && retcode != ETIMEDOUT) {
retcode = pthread_cond_timedwait(&cond, &mut, &timeout);
}
if (retcode == ETIMEDOUT) {
/* タイムアウト */
} else {
/* x と y の操作 */
}
pthread_mutex_unlock(&mut);
LinuxThreads |