CRITICAL (TU*X のみ)

OpenMP 並列コンパイラ指示文:コードのブロック参照を,一度に 1 つのスレッドに制限します。

形式

c$OMP CRITICAL [(name)]

block
c$OMP END CRITICAL [(name)]

c
次のいずれか:C (または c),!* (「並列指示文の構文規則」を参照)

name
クリティカル・セクションの名前。

block
文または構文の構造化ブロック (セクション)。ブロックの中または外に飛び越すことはできません。

規則と振る舞い

スレッドは,同じ名前を持つクリティカル・セクションを実行しているチーム内のスレッドがなくなるまで,クリティカル・セクションの先頭で待機します。名前なしの CRITICAL 指示文はすべて同じ名前にマップされます。

CRITICAL 指示文で名前が指定されている場合,対応する END CRITICAL 指示文にも同じ名前がなくてはなりません。CRITICAL 指示文に名前がない場合,対応する END CRITICAL 指示文にも名前があってはなりません。

クリティカル・セクション名はプログラムの大域言語要素です。指定された名前が他の言語要素と衝突した場合のプログラムの動作は不定です。

関連情報

OpenMP Fortran API コンパイラ指示文Tru64 UNIX システム用の並列指示文

次の例は,作業がキューから取り出されて処理が行われるというキューイング・モデルを示しています。複数のスレッドが同じ作業をキューから取り出すのを防ぐために,キューからの取り出しの操作はクリティカル・セクションに入れられています。

この例には 2 つの独立したキューがあるので,個々のキューは XAXISYAXIS という異なる名前を持つ CRITICAL 指示文で保護されています。

	c$OMP PARALLEL DEFAULT(PRIVATE) SHARED(X,Y)
	c$OMP CRITICAL(XAXIS)
	      CALL DEQUEUE(IX_NEXT, X)
	c$OMP END CRITICAL(XAXIS)
	      CALL WORK(IX_NEXT, X)
	c$OMP CRITICAL(YAXIS)
	      CALL DEQUEUE(IY_NEXT,Y)
	c$OMP END CRITICAL(YAXIS)
	      CALL WORK(IY_NEXT, Y)
	c$OMP END PARALLEL