同じ名前の CRITICAL 宣言子の動的な入れ子は許可されていません。
CRITICAL 宣言子は、指定された名前でクリティカル領域を構築します。これにより、その領域で一度に実行できるスレッドは 1 つのみになります。ネイティブ・スレッド化ライブラリーのクリティカル・セクションとは異なり、OpenMP* のクリティカル・セクションは リエントラントではありません。つまり、同じ物理スレッドがクリティカル・セクションから出ることなく、2 回入ろうとすると、自身によってデッドロックになります。
ID |
問題箇所 |
説明 |
---|---|---|
1 |
OpenMP* の使用方法に関するエラー |
2 番目に (不正に) 実行された CRITICAL 宣言子の場所 |
2 |
定義 |
最初に (正規に) 実行された CRITICAL 宣言子の場所 |
#include <stdio.h> void mysub(int ii, int * jj) { // bad nesting here #pragma omp critical (sum) *jj += ii; } int main(int argc, char **argv) { int i, j; #pragma omp parallel for private(j) ordered for (i = 1; i < 10; i++) { j = 0; #pragma omp critical (not_sum) mysub(i, &j); #pragma omp critical (sum) mysub(i, &j); #pragma omp ordered printf("%d\n", j); } return 0; }
© 2010 Intel Corporation. 無断での引用、転載を禁じます。