マルチスレッドのプログラミング

時刻指定のブロック

pthread_cond_timedwait(3C)は、abstime で指定された時刻を過ぎるとブロック状態を解除する点を除いて、pthread_cond_wait() と同じ動作をします。()

pthread_cond_timedwait の構文

int pthread_cond_timedwait(pthread_cond_t *restrict cv,
          pthread_mutex_t *restrict mp, 
          const struct timespec *restrict abstime);
#include <pthread.h>
#include <time.h>

pthread_cond_t cv;
pthread_mutex_t mp;
timestruct_t abstime;
int ret;

/* wait on condition variable */
ret = pthread_cond_timedwait(&cv, &
mp, &abstime); 

pthread_cond_timedwait() は、たとえエラーを返す場合でも、常に呼び出しスレッドが mutex ロックし、所有した状態で終了します。()

pthread_cond_timedwait() のブロック状態が解除されるのは、条件変数にシグナルが送られてきたときか、一番最後の引数で指定した時刻を過ぎたときです。


注 –

pthread_cond_timedwait() は取り消しポイントでもあります。



例 4–9 時刻指定のブロック

pthread_timestruc_t to;
pthread_mutex_t m;
pthread_cond_t c;
...
pthread_mutex_lock(&m);
clock_gettime(CLOCK_REALTIME, &to);
to.tv_sec += TIMEOUT;
while (cond == FALSE) {
    err = pthread_cond_timedwait(&c, &m, &to);
    if (err == ETIMEDOUT) {
        /* timeout, do something */
        break;
    }
}
pthread_mutex_unlock(&m);

pthread_cond_timedwait の戻り値

pthread_cond_timedwait() は、正常終了時に 0 を返します。それ以外の戻り値は、エラーが発生したことを示します。以下の条件が検出されると、この関数は失敗し、次の値を戻します。


EINVAL

説明:

cvmp、または abstime が不当なアドレスを指しています。


EINVAL

説明:

同じ条件変数への並行した pthread_cond_timedwait() 操作に対して異なる mutex が指定されました。


ETIMEDOUT

説明:

abstime で指定された時刻を過ぎています。


EPERM

説明:

呼び出し時に、mutex が現在のスレッドによって所有されていませんでした。

時間切れの指定は時刻で行うため、時間切れ時刻を再計算する必要がなく、効率的に条件を再評価できます。例 4–9 を参照してください。