04/18:Visual Studio 2010中Parallel的使用(ZT)
Example
(1) Old way without parallel
在单核时代,CPU在同一时间只能做一件事情,所以他只能先烧水,后锻炼,这样显然会耽误时间。
/ 串行式起床
(2).
- // 并行式起床
- private static void ParallelGetUp()
- {
- Start("ParallelGetUp");
- // 在烧水的同时,锻炼身体
- var steps = new Action[] { () => boil(), () => exercise() };
- Parallel.Invoke(steps);
- End("ParallelGetUp");
- }
对Parallel.Invoke进行控制
Parallel.Invoke提供了一个重载版本,它可以接受一个ParallelOptions对象作为参数,对 Parallel.Invoke的执行进行控制。通过这个对象,我们可以控制并行的最大线程数,各个任务是否取消执行等等。例如,在一个智能化的家中,系统会判断主人是否离开房间,如果主人离开了房间,则自动关闭屋子里的各种电器。利用Parallel.Invoke我们可以实现如下:
see
http://developer.51cto.com/art/201003/189896_1.htm
并行任务之间的同步
see
http://developer.51cto.com/art/201003/189896_2.htm
更复杂的任务之间的同步
http://developer.51cto.com/art/201003/189896_3.htm
我们在使用Barrier进行并行任务之间的同步时,有这样一个缺陷,我们需要预先知道所有需要同步的并行任务的数目,如果这个数目是随机的,就无法使用Barrier进行任务之间的同步了。并行任务数目不定这种情况很常见。我们还是来看上文中看电影的例子,每场进电影院看电影的观众数目是不固定的,那么退场的观众也是不固定的,甚至还有中途退场的。当所有观众都退场后,我们需要打扫电影院的卫生。这里需要的同步的就是所有观众都退场。针对这种数目不定的多个并行任务,.NET Framework提供了CountdownEvent这个类来进行任务之间的同步。
就像它的名字一样,CountdownEvent基于这样一个简单的规则:当有新的需要同步的任务产生时,就调用AddCount增加它的计数,当有任务到达同步点是,就调用Signal函数减小它的计数,当CountdownEvent的计数为零时,就表示所有需要同步的任务已经完成,可以开始下一步任务了。下面我们利用CountdownEvent来模拟一下观众进场立场的情景。
0 Comments:
Post a Comment
<< Home