临界区用在可能产生数据访问竞争的地方,用法:#pragma omp critical (name)
(name可省略)。保证每次只有一个线程进入。
注意:critical语句不允许互相嵌套
例:在一个并行域内的for任务分担域中,各个线程逐个进入到critical保护的区域内,比较当前元素的最大值得关系并可能进行最大值的更替,从而避免了数据竞争的情况。
#include <stdio.h>
#include <omp.h>
int main()
{
int i, max_x = -1, max_y = -1;
int arx[] = {5, 16, 87, 65, 24, 35, 9, 33};
int ary[] = {68, 4, 98, 43, 56, 18, 54, 11};
#pragma omp parallel for
for (i = 0; i < 8; i++)
{
#pragma omp critical
if (arx[i] > max_x)
max_x = arx[i];
#pragma omp critical
if (ary[i] > max_y)
max_y = ary[i];
}
printf("max_x = %d , max_y = %d\n", max_x, max_y);
return 0;
}