我正在努力理解为什么需要障碍来消除竞争条件?
#include<omp.h>
#include<stdio.h>
int main()
{
int sum = 0;
#pragma omp parallel num_threads(4)
for(int i = 0;i < 10;i++)
{
#pragma omp parallel for num_threads(4)
for(int j = 0;j < 10;j++)
{
#pragma omp critical
sum += 1;
}
// Uncommenting this barrier removes the race condition. Right now it is non-deterministic.
// #pragma omp barrier
#pragma omp single
sum += 1;
}
printf("%d", sum);
}
没有"pragma omp barrier";,另一个线程可能同时访问"内部的相同的sum变量;pragma omp critical";部分这将导致未定义的结果。
屏障迫使所有线程完成内部for循环,然后单个线程可以继续执行最后一部分,而不会有任何竞争条件的风险。