pthread_cond_init() - 条件変数の初期化

標準

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

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

両方

POSIX(ON)

形式

#define _OPEN_THREADS
#include <pthread.h>

int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *attr);
SUSV3:
#define _UNIX03_THREADS 
#include <pthread.h>
int pthread_cond_init(pthread_cond_t * __restrict__cond, 
                      pthread_condattr_t * __restrict__attr);

機能説明

attr によって参照された属性を使用して、cond によって 参照された条件変数を初期設定します。attr が NULL の場合には、デフォルト条件変数属性が使用されます。

戻り値

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

正常に実行されなかった場合、pthread_cond_init() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
ENOMEM
条件変数を初期設定するためのメモリーが不十分です。
EAGAIN
別の条件変数を初期化するためにシステムで必要なリソース (メモリー以外) が 不足しました。
EBUSY
インプリメンテーションが、cond、すなわち、前に初期化されているが、まだ破棄されていな い条件変数によって参照されたオブジェクトを初期化しようとする試みを検出しました。
EINVAL
attr によって指定された値は無効です。

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

使用上の注意

_OPEN_SYS_MUTEX_EXT フィーチャー・スイッチをオプションで組み込むことがで きます。 このフィーチャーが設定されると、相当に大きい pthread_cond_t オブジェ クトが定義されます。 このフィーチャーは、共用メモリー内の mutex と条件変数の管理に使用されます。 このフィーチャー・スイッチが共用メモリー内の条件変数の定義で設定された場合、 同じフィーチャー・スイッチを、条件変数に関連付けられた mutex の定義で設定しなけ ればなりません。

提供された拡張 pthread_cond_t オブジェクトが共用メモリー内にない場合、 そのオブジェクトは他のプロセスからアクセスできないので、 pthread_cond_init() はそのオブジェクトを非共用オブジェクトとして扱います。

_OPEN_SYS_MUTEX_EXT フィーチャー・スイッチが設定されている場合、 pthread_cond_wait() または pthread_cond_timedwait() が最初に出されたとき、 指定された mutex に共用条件変数が結合され、その条件変数と mutex の存続中、結合 されたままです。 その条件変数または mutex が破棄されるまで、他の mutex は、その指定された条 件変数に、またはその逆に関連付けることはできません。

pthread_cond_t オブジェクトは同じコンパイル単位内で定義および初期化する ようにお勧めします。 初期化される pthread_cond_t オブジェクトを移動させる場合、初期化コードは、 そのオブジェクトを定義するコードと同じ _OPEN_SYS_MUTEX_EXT フィーチャー設定値で コンパイルされたことを確認してください。

以下の手順を実行すると、ストレージ・オーバーレイが起きて、結果は予測不能に なる可能性があります。
  1. _OPEN_SYS_MUTEX_EXT フィーチャーの #define なしで pthread_cond_t オブジ ェクトを (共用ストレージ内で) 宣言または定義する。 作成された pthread_cond_t オブジェクトは標準サイズ (すなわち、小さい) で、 _OPEN_SYS_MUTEX_EXT フィーチャーは定義されません。
  2. pthread_cond_t オブジェクトを、共用オブジェクトとして初期化するために、 _OPEN_SYS_MUTEX_EXT フィーチャーを定義してコンパイルされた別のコード単位に渡す。 pthread_cond_t 初期化では、一般的に以下のステップが実行されます。
    1. pthread_condattr_init()
    2. pthread_condattr_setpshared()。 このステップは、pthread_cond_t の属性を PTHREAD_PROCESS_SHARED と設定し、そ のオブジェクトを拡張サイズと指定します。
    3. pthread_cond_init()。 このステップは、渡された (小さい) pthread_cond_t オブジェクトを拡張オブジェ クトであるかのように初期化し、ストレージ・オーバーレイを起こします。

CELEBP19
⁄* CELEBP19 *⁄                                   
#define _OPEN_THREADS                                                           
#include <pthread.h>                                                            
#include <stdio.h>                                                              
                                                                                
main() {                                                                        
  pthread_cond_t cond;                                                          
                                                                                
  if (pthread_cond_init(&cond, NULL) != 0) {                                    
    perror("pthread_cond_init() error");                                        
    exit(1);                                                                    
  }                                                                             
                                                                                
  if (pthread_cond_destroy(&cond) != 0) {                                       
    perror("pthread_cond_destroy() error");                                     
    exit(2);                                                                    
  }                                                                             
}                                                                               

関連情報