OpenMP 线程同步之临界区

简介: 多核/多线程编程中肯定会用到同步互斥操作。除了互斥变量以为,就是临界区。 临界区是指在用一时刻只允许一个线程执行的一段用{...},包围的代码段。 在OpenMP中临界区声明方法如下: #pragma omp critical [(name)] //[]表示名字可选 {     //需要同...

多核/多线程编程中肯定会用到同步互斥操作。除了互斥变量以为,就是临界区。

临界区是指在用一时刻只允许一个线程执行的一段用{...},包围的代码段。

在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基本就是不确定的

相关文章
|
调度 Windows
Windows多线程——临界区、事件、互斥量、信号量详解加代码
Windows多线程——临界区、事件、互斥量、信号量详解加代码
527 0
临界区线程对象的使用
临界区线程对象的使用
114 0
|
C++ 开发者
临界区线程对象的使用
临界区线程对象的使用代码。
426 0
|
Java
Java 并发/多线程教程(八)-竞态条件和临界区
      本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获。由于个人水平有限,不对之处还望矫正!       竞态条件是在临界区内可能发生的一种特殊情况。
1275 0
|
Java 缓存 数据安全/隐私保护
《Java线程与并发编程实践》—— 2.2 同步临界区的访问
你会看到,同步能够解决之前的线程问题。同步是JVM的一个特性,旨在保证两个或者多个并发的线程不会同时执行同一块临界区,临界区就是必须以串行方式(一次一条线程)访问的一段代码块。
2015 0
|
API Windows
windows api学习笔记-用临界区对象使线程同步
#include #include #include using namespace std; int g_nCount1 = 0; int g_nCount2 = 0; CRITICAL_SECTION g_cs;//临界区 BOOL g_bContinue = TRU...
793 0