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

同期バリアーの初期化

バリアーにリソースを割り当て、その属性を初期化するには、pthread_barrier_init(3C) を使用します。

pthread_barrier_init() の構文

int pthread_barrier_init(pthread_barrier_t  *barrier, 
          const pthread_barrierattr_t *restrict attr, 
          unsigned count);
#include <pthread.h> 
pthread_barrier_t barrier; 
pthread_barrierattr_t attr;
unsigned count;
int ret; 
ret = pthread_barrier_init(&barrier, &attr, count);

pthread_barrier_init() 関数は、barrier が参照するバリアーを使用するために必要なすべてのリソースを割り当て、attr が参照する属性でバリアーを初期化します。attr が NULL の場合は、デフォルトのバリアー属性が使用されます。この場合の結果は、デフォルトのバリアー属性オブジェクトのアドレスを渡す場合と同じです。count 引数には、pthread_barrier_wait() を呼び出す必要のあるスレッドの数を指定します。それまでは、どのスレッドも呼び出しから正常に復帰できません。count で指定する値は 1 以上にする必要があります。

pthread_barrier_init() の戻り値

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


EINVAL

説明:

count で指定された値が 0 に等しいか、または attr で指定された値が無効です。


EAGAIN

説明:

別のバリアーを初期化するために必要なシステムリソースが不足しています。


ENOMEM

説明:

メモリー不足のためバリアーを初期化できません。


EBUSY

説明:

バリアーが別のスレッドによって使用されている間 (たとえば、pthread_barrier_wait() の呼び出しで使用されている間) にそのバリアーの削除の試行が検出されました。