多核/多線程編程中肯定會用到同步互斥操作。除了互斥變量以為,就是臨界區。
臨界區是指在用一時刻只允許一個線程執行的一段用{...},包圍的代碼段。
在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基本就是不確定的。
