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