pthread_cond_timedwait() - 条件変数の待機

標準

標準/拡張機能 C/C++ 依存項目

POSIX.4a
Single UNIX Specification、バージョン 3

両方

POSIX(ON)

形式

#define _OPEN_THREADS
#include <pthread.h>

int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
                           const struct timespec *abstime);
SUSV3:
#define _UNIX03_THREADS 
#include <pthread.h>
int pthread_cond_timedwait(pthread_cond_t * __restrict__cond,
                           pthread_mutex_t * __retrict__mutex,
                           const struct timespec * __restrict__abstime); 

機能説明

スレッドは、条件が満たされるか、あるいは指定時間になるまで、条件変数で 待機できます。pthread_cond_timedwait() は pthread_cond_wait() と同じですが、abstime で指定した絶対時間が以下の条件のいずれかに当てはまると エラーを戻します。
  • cond のシグナルがあるか、あるいはブロードキャストされる前に パスします。
  • 呼び出し時には、既にパスしています。

このようなタイムアウトが起こると、pthread_cond_timedwait() は、mutex (pthread_mutex_init() で作成) によって参照される mutex を再取得します。

struct timespec 内の 2 つのエレメントは、次のとおり定義されます。
tv_sec
条件シグナルを待つ時間。これは、UTC 1970 年 1 月 1 日の深夜からの秒数で表されます。指定された値は、UTC 1970 年 1 月 1 日の深夜からの秒数で表された現在の カレンダー時間かそれを超える時間になっている、あるいは 2,147,483,648 秒未満になっている必要が あります。
tv_nsec
待機停止時点を判別するために tv_sec に追加されるナノ秒で表示される時間。指定された値は、ゼロ (0) 以上か、あるいは 1,000,000,000 (10 億) 秒未満になっている必要があります。

戻り値

正常に実行された場合、pthread_cond_timedwait() は 0 を戻します。

正常に実行されなかった場合、pthread_cond_timedwait() は -1 を戻して、errno を次のいずれかの 値に設定します。

エラー・コード
説明
EAGAIN
専用条件変数の場合、abstime で指定された時間が経過しました。
EINVAL
次のエラー条件のいずれかである可能性があります。
  • cond によって指定された値は無効です。
  • mutex によって指定された値は無効です。
  • abstime (tv_sec) によって指定された値は無効です。
  • abstime (tv_nsec) によって指定された値は無効です。
  • 同じ条件変数の並行操作に異なる mutex が指定された。
ETIMEDOUT

共用条件変数の場合、abstime で指定された時間が経過しました。

注: SUSV3 では、abstime で指定した時間が経過すると、pthread_cond_timedwait() はまた専用条件変数に ETIMEDOUT を戻します。
EPERM
mutex は呼び出された時に現行スレッドによって所有されていません。

Single UNIX Specification、バージョン 3 の特殊な動作: 正常に実行されなかった場合、pthread_cond_timedwait() はエラーを示すエラー番号を戻します。

使用上の注意

条件変数が共用 (PTHREAD_PROCESS_SHARED) の場合、mutex も共用でなければな らず、mutex が作成されて初期化されたとき、_OPEN_SYS_MUTEX_EXT フィーチャーが 定義されている必要があります。

条件変数が専用 (PTHREAD_PROCESS_PRIVATE) の場合、mutex も専用でなければ なりません。

条件変数が共用の場合、特定の条件変数用の pthread_cond_wait() また は pthread_cont_timedwait() の呼び出しはすべて、プロセスの存続中、すなわち、 条件変数と mutex の両方が破棄されるまで (pthread_cond-destroy() お よび pthread_mutex_destroy() を使う)、同じ mutex を使用しなければなりません。

CELEBP21
⁄* CELEBP21 *⁄                                   
#define _OPEN_THREADS                                                           
#include <pthread.h>                                                            
#include <stdio.h>                                                              
#include <time.h>                                                               
#include <errno.h>                                                              
                                                                                
main() {                                                                        
  pthread_cond_t cond;                                                          
  pthread_mutex_t mutex;                                                        
  time_t T;                                                                     
  struct timespec t;                                                            
                                                                                
  if (pthread_mutex_init(&mutex, NULL) != 0) {                                  
    perror("pthread_mutex_init() error");                                       
    exit(1);                                                                    
  }                                                                             
                                                                                
  if (pthread_cond_init(&cond, NULL) != 0) {                                    
    perror("pthread_cond_init() error");                                        
    exit(2);                                                                    
  }                                                                             
                                                                                
  if (pthread_mutex_lock(&mutex) != 0) {                                        
    perror("pthread_mutex_lock() error");                                       
    exit(3);                                                                    
  }                                                                             
                                                                                
  time(&T);                                                                     
  t.tv_sec = T + 2;                                                             
  printf("starting timedwait at %s", ctime(&T));                                
  if (pthread_cond_timedwait(&cond, &mutex, &t) != 0)                           
    if (errno == EAGAIN)                                                        
      puts("wait timed out");                                                   
    else {                                                                      
      perror("pthread_cond_timedwait() error");                                 
      exit(4);                                                                  
    }                                                                           
                                                                                
  time(&T);                                                                     
  printf("timedwait over at %s", ctime(&T));                                    
}                                                                               
出力:
starting timedwait at Fri Jun 16 10:44:00 2006
wait timed out
timedwait over at Fri Jun 16 10:44:02 2006

関連情報