多核/多线程编程中肯定会用到同步互斥操作。除了互斥变量以为,就是临界区。
临界区是指在用一时刻只允许一个线程执行的一段用{...},包围的代码段。
在OpenMP中临界区声明方法如下:
#pragma omp critical [(name)] //[]表示名字可选
{
//需要同一时刻只能有一个线程访问的代码
}
如下面的代码:
#include <stdio.h>
#include <omp.h> int main()
{
int sum = ;
#pragma omp parallel
printf("Hello World!!!\n"); #pragma omp parallel for
for (int i = ; i < ; ++i)
{
#pragma omp critical
{
sum = sum + i%;
}
}
printf("Sum: %d\n" ,sum);
return ;
}
执行结果:
可以看到,机器有8个核,启动了8个线程。如果将代码中的第13行注释掉,执行结果中的Sum基本就是不确定的。