Hello
Just write a small omp test, and it does not work correctly all the times:
#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;
}
The usage of j for writing from all threads is incorrect in this example, BUT
there must be only nondeterministic value of j
I have a freeze.
Compiled with gcc-4.3.1 -fopenmp a.c -o gcc -static
Run on 4-core x86_Core2 Linux server: $ ./gcc and got freeze (sometimes; like 1 freeze for 4-5 fast runs).
Strace:
[pid 13118] <... futex resumed> ) = 0
[pid 13118] futex(0x80d3014, FUTEX_WAIT, 2, NULL <unfinished ...>
[pid 13120] <... futex resumed> ) = 0
[pid 13119] futex(0x80d3014, FUTEX_WAIT, 2, NULL <unfinished ...>
[pid 13120] futex(0x80d3014, FUTEX_WAKE, 1) = 1
[pid 13120] futex(0x80cd798, FUTEX_WAIT, 1, NULL <unfinished ...>
[pid 13109] <... futex resumed> ) = 0
[pid 13109] futex(0x80d3014, FUTEX_WAKE, 1) = 1
[pid 13109] futex(0x80d3020, FUTEX_WAIT, 251, NULL <unfinished ...>
[pid 13118] <... futex resumed> ) = 0
[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>
Why do I have a freeze (deadlock)?