小さな omp テストを書くだけでは、常に正しく動作するとは限りません。
#include <omp.h>
int main() {
int i,j=0;
#pragma omp parallel
for(i=0;i<1000;i++)
{
#pragma omp barrier
j+= j^i;
}
return j;
}
j
この例では、すべてのスレッドからの書き込みに対するの使用は正しくありませんが、
j の非決定論的な値のみが存在する必要があります
フリーズしています。
でコンパイルgcc-4.3.1 -fopenmp a.c -o gcc -static
4 コアの x86_Core2 Linux サーバーで実行:$ ./gcc
フリーズしました (4 ~ 5 回の高速実行で 1 回フリーズするなど)。
トレース:
[pid 13118] futex(0x80d3014, FUTEX_WAKE, 1) = 1
[pid 13119] <... futex resumed> ) = 0
[pid 13118] futex(0x80d3020, FUTEX_WAIT, 251, NULL <unfinished ...>
[pid 13119] futex(0x80d3014, FUTEX_WAKE, 1) = 0
[pid 13119] futex(0x80d3020, FUTEX_WAIT, 251, NULL
<freeze>
フリーズ (デッドロック) が発生するのはなぜですか?