Просто напишите небольшой тест 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
для записи из всех потоков некорректно в этом примере, НО
Скомпилировано с gcc-4.3.1 -fopenmp a.c -o gcc -static
Запуск на 4-ядерном x86_Core2 сервере Linux: $ ./gcc
и получил зависание (иногда; например, 1 остановка для 4-5 быстрых запусков).
Strace:
[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>
Почему у меня заморозка (тупик)?