组合CC++并行编程并行块研究

2012-10-20 09:49:36邕江大学人文学院陈积常
河南科技 2012年6期
关键词:嵌套线程语句

邕江大学 人文学院 陈积常

组合CC++并行编程并行块研究

邕江大学 人文学院 陈积常

在CC++语言中,并行控制线程的创建大都使用并行块机制来完成。并行控制块(par)的结构与C语言或C++语言中的复合声明比较相似,区别仅在于结构之前所用的是关键字“par”,而非其他串行语言中的关键字。

一、举例说明

1.并行块结构说明。关键代码如下所示:

除了某些特殊情况外,并行块里面的声明都应是CC++的合法声明。par不同于普通C++语言的模块,在par里各种声明的执行顺序都是不固定的,块里的各个声明语句都是以交错的方式或者并行的方式执行的。

2.并行块控制语句。下文是1个并行块的控制程序代码:

可以看到,par之中有2个独立的控制线程:第1个语句为“a=2;”,第2个语句为“b=c+3;”,而“d=b+1;”这个语句必须在“a= 2;”和“b=c+3;”语句运行完毕之后方可运行。

二、结构

并行块的重要特征是自身结构提供了并行代码,一个被定义的并行块只有在并行体里面的所有语句运行结束之后才能终止。因此,终止1个并行块,意味着块内所有线程都已运行完毕。关键代码如下:

赋值于a,b,c的各个线程在不同的时刻将以不同的顺序来完成其赋值工作,即在时刻T1可能是a先完成,接着到b,最后到c;在时刻T2有可能是b先完成,然后到a,最后到c。但是,不管以怎样的顺序来完成,整个并行块只有在这3个线程完成之后方能结束,即只有当3个并行块完成之后,才能执行“sum= a+b+c”这个语句。

三、数据共享

CC++语言允许出现数据共享情况,只要通过以下一条规则编写程序便可,规则为:如果一个变量被并行块内一个线程修改了,其后线程应不再使用这个变量。本文,笔者通过下面的例子来解释其规则。

此并行块已经违反了变量的共享规则。变量x在并行块内被修改了2次,虽然这些代码在编译时可能未出现错误,甚至可以正确的运行,但是这种情况是极度不安全的,因为到最后,并行块的数值是不固定的,它可能是1也可能是2,或者两者都不是。如果变量以这种方式被共享的话,编写出来的程序将是错误的。在这里,既不允许其他线程再修改已被修改过的变量,也不允许其他线程再引用已被修改过的变量,如下例所示程序:

在该例子中,第1个语句给s赋值,第2个语句又引用了s。虽然在运行时,未必会出现错误的结果,但这是一个错误的程序,并行块中的n的值是混乱的(或者s也可能出现此情况)。实际编程中要避免使用该类程序。

四、嵌套

像普通串行设计语言一样,在并行设计语言CC++之中也存在嵌套行为。关键代码如下所示:

在上例中,函数trial()被执行并将结果赋予result1之后,generate_stats()才开始执行。

五、局限性

1.并行块中线程的运行状态是交错的、任意的,它无法确保特定的线程指令在之后多久被执行。

2.不允许在并行块的范围之内对变量进行声明,这是与并行块的共享变量规则相一致的,然而在嵌套中定义则是允许的。

3.跳入、跳出(goto into ,out of)并行块或者在并行块内的各个语句间相互跳转都是不允许的。但是no break,goto,continue,return并行快是可用的。

六、并行块的编程实例

利用 ∏/4=1-1/3+1/5-1/7…公式求∏的近似值,直到最后一项的绝对值小于0.000 01为止。关键代码如下:

该程序主要通过并行块来实现对∏的求解。并行块中“pi= pi+t”、“n= n+2”、“s=-s”3个语句是并行执行的,这3个语句之间互不关联,每个语句都被创建为一个独立的线程,线程之间的运行是并行的。并行块中的线程是并行的。只有当其并行块内所有的线程运行结束时,整个并行块运行才终止。

猜你喜欢
嵌套线程语句
基于嵌套Logit模型的竞争性选址问题研究
重点:语句衔接
精彩语句
浅谈linux多线程协作
环球市场(2017年36期)2017-03-09 15:48:21
如何搞定语句衔接题
语文知识(2014年4期)2014-02-28 21:59:52
一种基于区分服务的嵌套队列调度算法
计算机工程(2014年6期)2014-02-28 01:25:29
无背景实验到有背景实验的多重嵌套在电气专业应用研究
河南科技(2014年23期)2014-02-27 14:19:17
Linux线程实现技术研究
连续批加工过程中嵌套自相关数据的控制图设计
么移动中间件线程池并发机制优化改进