只需编写一个小 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
并被冻结(有时;例如 1 冻结 4-5 次快速运行)。
追踪:
[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>
为什么我会出现冻结(死锁)?