用户名:
密  码:
验证码:
 
JAVA J2EE J2ME J2SE JSP C/C++ C语言 C++ VC MFC Web前台 Html css JavaScript 软件测试 软件测试入门 LoadRunner Windows Win2008 Win2003 WinXP
.NET ASP.NET VB.NET MVC Linux/Unix Linux Unix Shell Web开发 PHP ASP Ajax IIS Apache 编程语言 C VB Delphi 汇编 数据库 MSSQL Mysql Oracle

OpenMP与C++:事半功倍地获得多线程的好处(下)

www.diybl.com 时间:2008-07-09 作者:佚名 编辑:本站 点击:  [评论]

用以同步的编译器指令

       在多个线程并发的时候,某一线程常常会需要同步其它线程。OpenMP支持多种类型的同步,以在不同的情境下解决问题。

       其中之一就是暗含的barrier同步。在每一个并行区域都有一个暗含的barrier,用以同步并行区域中的所有线程。一个barrier同步要求所有线程执行到此,然后才能往下执行。

       #pragma omp for#pragma omp single#pragma omp sections程序块都有暗含的barrier同步。从上述三种工作共享的程序块中去除暗含的barrier同步的方法是增加nowait子句:

       #pragma omp parallel

{

    #pragma omp for nowait

    for(int i = 1; i < size; ++i)

        x[i] = (y[i-1] + y[i+1])/2;

}

如你所见,工作共享指令中的nowait子句指明线程不需要在for循环结束时同步,尽管线程将在并行区域结束处同步。

       另一种是明确声明barrier同步,在一些情境下你可能需要在并行区域出口之外放置barrier同步,这时你可以在代码里加一个#pragma omp barrier指令。

       临界区能够像barrier那样使用,在Win32 API中通过EnterCriticalSectionExitCriticleSection来进出临界区。OpenMP通过#pragma omp critical [name]指令给予程序员同样的能力。这与Win32http://msnpiki.msnfanatic.com/index.php/Main_Page-->

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
如果图片或页面不能正常显示请点击这里 站内搜索:
推荐文章
文章评论
请您留言
昵称:  
验证码:
注册会员
会员登陆
频道地图