一起来学OpenMP(9)——线程同步之事件同步机制

原创 2010年06月09日 10:57:00

一、引言

前边已经提到过,线程的同步机制包括互斥锁同步和事件同步。互斥锁同步包括atomic、critical、mutex函数,其机制与普通多线程同步的机制类似。而事件同步则通过nowait、sections、single、master等预处理器指示符声明来完成。

 

二、隐式栅障

 在介绍本节内容之前,先介绍一下并行区域中的隐式栅障。

 

上图中,barrier为隐式栅障,即并行区域中所有线程执行完毕之后,主线程才继续执行。

 

三、nowait、sections、single、master事件同步

1. nowait用来取消栅障,其用法如下:

#pragma omp for nowait //不能用#pragma omp parallel for nowait

#pragma omp single nowait

 

例如:

输出:

可以看到,第一个for循环的两个线程中的一个执行完之后,继续往下执行,因此同时打印出了第一个循环的+和第一个循环的-。

如果去掉第一个for循环的nowait声明,则输出如下:

 

可以看到,第一个for循环的两个线程都执行完之后,才开始同时执行第二个for循环。也就是说,通过#pragma omp for声明的for循环结束时有一个默认的栅障。

2. 显式同步栅障#pragma omp barrier

输出如下:

 

可以看出,两个线程执行了第一个for循环,当两个线程同时执行完第一个for循环之后,在barrier处进行了同步,然后执行后边的for循环。

 

3. master通过#pragma omp mater来声明对应的并行程序块只由主线程完成。

例如:

执行结果如下:

 

可以看到,进入parallel声明的并行区域之后,创建了两个线程,主线程执行了for循环,而另一个线程没有执行for循环,而直接进入了for循环之后的打印语句,然后执行for循环的线程随后还会再执行一次后边的打印语句。

 

5. section用来指定不同的线程执行不同的部分

通过一个示例说明其使用方法:

输入结果:

 

可以看到,因为并行区域中有两个线程,所以两个section同时执行。

 

四、小结

介绍了nowait、single、barrier、section的用法。下一节介绍线程的调度优化。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/donhao/article/details/5657717

OpenMP学习笔记

原文:http://blog.sina.com.cn/s/blog_66474b160100z15b.html 1. OpenMP是一种API,用于编写可移植的多线程应用程序,无需程序员进...
  • zsc09_leaf
  • zsc09_leaf
  • 2012年07月17日 10:07
  • 32284

OpenMP 参考(指令详解)

共享工作(Work-Sharing) 结构 共享工作结构将它作用的代码段在抵达此代码段的线程中分开执行Work-sharing 不会产生新线程进入工作共享结构时没有关卡,但结束时会有 Work...
  • saga1979
  • saga1979
  • 2011年03月21日 17:53
  • 11423

OpenMP中的同步和互斥

在多线程编程中必须考虑到不同的线程对同一个变量进行读写访问引起的数据竞争问题。如果线程间没有互斥机制,则不同线程对同一变量的访问顺序是不确定的,有可能导致错误的执行结果。 OpenMP中有两种不同类型...
  • dcrmg
  • dcrmg
  • 2016年12月26日 22:41
  • 3044

OpenMP

OpenMP2008-8-10   version 1.0  1       简介www.openmp.orgGNU的gomp项目;Include ;编译参数-fopenmp打开openmp,如果使用...
  • netnote
  • netnote
  • 2008年10月24日 18:42
  • 7817

OpenMP

1        简介 www.openmp.org GNU的gomp项目; Include ;编译参数-fopenmp打开openmp,如果使用-lgomp则编译成单线程版本; 条件编译 #...
  • diaoguangqiang
  • diaoguangqiang
  • 2013年12月13日 09:11
  • 520

OpenMP(三) 线程同步

OpenMP --- 线程同步 1. 引言     在OpenMP中,线程同步机制包括互斥锁同步机制和事件同步机制。   2. 互斥锁同步     互斥锁同步的概念类似于Windows中的临...
  • stormbjm
  • stormbjm
  • 2013年07月19日 21:51
  • 1377

一起来学OpenMP(9)——线程同步之事件同步机制

一起来学OpenMP(9)——线程同步之事件同步机制   (2012-03-04 12:46:32) 转载▼ 一、引言 前边已经提到过,线程的同步机制包括互斥锁同步和事件同步。互...
  • s170262941
  • s170262941
  • 2013年09月10日 18:20
  • 704

OpenMP程序开发

OpenMP是一个业界的标准,很早以前就有了,只是近一段时间才逐渐热起来。我们可以在C/C++和Fortran使用OpenMP、很容易的引入多线程。 OpenMP目前的标准是2.5,3.0马...
  • sichuanpb
  • sichuanpb
  • 2013年12月10日 15:34
  • 604

一起来学OpenMP(9)——线程同步之事件同步机制

一、引言 前边已经提到过,线程的同步机制包括互斥锁同步和事件同步。互斥锁同步包括atomic、critical、mutex函数,其机制与普通多线程同步的机制类似。而事件同步则通过nowait、sec...
  • mydear_33000
  • mydear_33000
  • 2011年10月31日 13:51
  • 4517

一起来学OpenMP(1)

Open是一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言。 我的开发环境是Windows、VS2008、双核处理器。   1。 在VS2008程序目录下找到vcomp90d.dl...
  • mydear_33000
  • mydear_33000
  • 2011年10月31日 13:48
  • 1679
收藏助手
不良信息举报
您举报文章:一起来学OpenMP(9)——线程同步之事件同步机制
举报原因:
原因补充:

(最多只允许输入30个字)