バリアは、プロセスのセットがグローバルに同期する同期構造です。つまり、セット内の各プロセスがバリアに到着し、他のすべてのプロセスが到着するのを待ってから、すべてのプロセスがバリアを離れます。セット内のプロセスの数を3とし、Sを通常のPおよびV関数を持つバイナリセマフォとします。左側に行番号が示されているバリアの次のC実装について考えてみます。
void barrier (void) {
1: P(S);
2: process_arrived++;
3: V(S);
4: while (process_arrived !=3);
5: P(S);
6: process_left++;
7: if (process_left==3)
{
8: process_arrived = 0;
9: process_left = 0;
10: }
11: V(S);
}
変数process_arrivedとprocess_leftはすべてのプロセスで共有され、ゼロに初期化されます。並行プログラムでは、3つのプロセスすべてが、グローバルに同期する必要があるときにバリア関数を呼び出します。
上記の実装は機能しますか?2つのバリア呼び出しがすぐに連続して使用されると、デッドロックにつながる可能性があると思います。バリアに入る最初のプロセスは、process_arrivedがゼロになるまで待機してからP(S)の実行に進むためです。