相関関数:
(pthread_barrier_t *バリア、int型のpthread_barrier_init
のconst pthread_barrierattr_t * attrの、制限
符号なしCOUNTを);
COUNTパラメータが0より大きくなければなりません、あなたがスレッドを同期したい番号を指定します。すべてのスレッドがpthread_barrier_wait実行された場合にのみ 、後に、彼らはpthread_barrier_waitから戻ることができます。
pthread_barrier_wait:現在のスレッドの同期は、オブジェクトの障壁を同期させます。バリアがで実行されたときにpthread_barrier_wait達するのスレッド数設定値、スレッドは他のスレッドを与えるPTHREAD_BARRIER_SERIAL_THREAD戻り値、0の戻り値を取得しました。バリアオブジェクトは、最後の初期状態にリセットされます。
障壁は、
いくつかの並列計算を続行する前に特定の時点で「会う」する必要があります。これは、当然のことながら、セマフォを用いて達成することができるが、他の構築物は、多くの場合、より便利である:障壁(のpthreadsライブラリpthread_barrier_t)。動機付けの例として、このプログラムを取る:
の#define _XOPEN_SOURCE 600
の#include <pthread.hの>
する#include <STDLIB.H>
する#include <stdio.hの>
に#define ROWS 10000件
の#define COLS 10000件
の#defineスレッド10
ダブルinitial_matrix [ROWS ] [COLS]。
ダブルfinal_matrix [ROWS] [COLS]。
//バリア変数
pthread_barrier_tのバール。
externボイドドット積(INT行、INT COL、
二重ソース[ROWS] [COLS]を、
二重先[ROWS] [COLS])。
EXTERN二重決定基(二重行列[ROWS] [COLS])。
ボイド* entry_point(ボイド*引数)
{
int型のランク=(INT)引数。
(;行<(ランク+ 1)* THREADS; INT行=ランク* ROWS /スレッド++行)のために
のために(INT COL = 0、COL <COLS; ++ COL)
ドット積(行、列、initial_matrix、final_matrix) ;
//同期ポイント
int型RC = pthread_barrier_wait(&バール)。
もし(!RC = 0 && RC = PTHREAD_BARRIER_SERIAL_THREAD)
{
のprintf( "バリアに待つことができませんでした\ n"は);
出口(-1)。
}
(INT行=ランク* ROWS /スレッド、行<(ランク+ 1)* THREADS; ++行)のために
(INT COL = 0、COL <COLS; ++ COL)のための
ドット積(行、列、final_matrix、initial_matrix)。
}
int型のmain(int型ARGC、チャー** ARGV)
{
がpthread_t THR [THREADS]。
//バリア初期化
(pthread_barrier_init(&バール、NULL、スレッド))なら
、{
のprintf( "バリアを作成できませんでした\ n");
-1を返します。
}
(iは0 = INT; I <THREADS; ++ i)に対する
{
IF(のpthread_create(&THR [i]は、NULL、&entry_point、(ボイド*)は、i))
{
のprintf( "スレッド%dを作成できませんでした\ n"は、 私);
-1を返します。
}
}
I <THREADS; iが0 = INT(のために、
{
IF(pthread_joinを(THR [i]は、NULL))
{
のprintf( "スレッド%dの\ nは参加できませんでした"、I)。
-1を返します。
}
}
ダブルDET =決定基(initial_matrix)。
printf( "の行列M ^ 4 =%F \ n"は、DET)。
0を返します。
}
このプログラムは、スポーン行列乗算の計算部分にそれぞれ割り当てスレッド数、。別の行列乗算:各スレッドは、次の段階で、その演算結果を使用します。
ここで注意すべき点がいくつかあります。
上部のバリア宣言
メインにおけるバリア初期化
仕上げにそのピアーの各スレッドが待機ポイント。
原文链接:http://pages.cs.wisc.edu/~travitch/pthreads_primer.html