异步和并行的简单说明

Coordinator
Mar 22, 2012 at 3:08 AM

异步,容易和 并行混淆。

的确有非常相似之处,甚至可以说几乎一样,而且他们总是一起出现的。

我认为更多是阐述者所想强调的方向上的区分。

一般强调并行的时候,强调的是要把且无关的运算一起计算,强调的时间性。异步则是强调响应性

 

 

比如for(int i=0;i<100;i++)

   Caculate(Crhome[i]);

这里对每一个i来说,他们的计算可以说是无关的,所以可以并行化。

 

异步(非阻塞)则是想强调通信的模型,也即知道某个计算结果的方法,这是我们几乎最常用的,所以一般也感觉不到这是一个通信,但是为了说明问题,我只好说它是一个通信。

比如window1::OnClick()

{

   bool bSuccess=   CaulculateChrome();

  if(bSuccess).....

}

这里,window1对象和CaulculateChrome方法的通信是同步的,也就是会一直等到CaulculateChrome的结果出来再继续进行自己的事情,当然在此期间也就无法知道其进度。

 

而如果改为异步(非阻塞)模式,则是如下

window1::OnClick()

{

  CaulculateChromeAsync();

 

}

window1::OnCauculateChromeProgress(float ratio)

{

show...

}

window1::OnCaulculateCrhomeEnd(bool result)

{

   弹出提示框等。

}

这样,window1和异步获得计算结果和进度,并且不耽误眼前的事情。那么这是不是并行化呢?是!但是其实这里,并行化不是目的,目的是让通信模型更加合理,以便ui线程有机会响应用户请求而不是无响应。

当然,异步通信明显比同步通信复杂。比如window1::OnCaulculateCrhomeEnd(bool result)里面,是否还要检查当前窗口是否被隐藏了呢?或者窗口正在被销毁中(虽然这很少见,但是用户可能在结果回来的前一刻恰好关闭窗口)。

那么这是弹出提示的话就会造成一些问题。而同步通信模型里面,这种情况是不存在的。

这仅仅是我一些不成熟的想法,表达能力有限,大家还请多指正。