Sunday, April 18, 2010

04/18:Visual Studio 2010中Parallel的使用(ZT)

 

Example

 

(1) Old way without parallel

在单核时代,CPU在同一时间只能做一件事情,所以他只能先烧水,后锻炼,这样显然会耽误时间。

​/​ ​串​行​式​起​床​ ​

  • p​r​i​v​a​t​e​ ​s​t​a​t​i​c​ ​v​o​i​d​ ​G​e​t​U​p​(​)​ ​
  • {​ ​
  • ​ ​ ​ ​S​t​a​r​t​(​"​G​e​t​U​p​"​)​;​ ​
  • ​ ​ ​ ​/​/​ ​先​烧​水​ ​
  • ​ ​ ​ ​b​o​i​l​(​)​;​ ​
  • ​ ​ ​ ​/​/​ ​后​锻​炼​ ​
  • ​ ​ ​ ​e​x​e​r​c​i​s​e​(​)​;​ ​
  • ​ ​ ​ ​E​n​d​(​"​G​e​t​U​p​"​)​;​ ​
  • }​ ​
  •  
  •  
  • /​/​ ​锻​炼​ ​
  • p​r​i​v​a​t​e​ ​s​t​a​t​i​c​ ​v​o​i​d​ ​e​x​e​r​c​i​s​e​(​)​ ​
  • {​ ​
  • ​ ​ ​ ​C​o​n​s​o​l​e​.​W​r​i​t​e​L​i​n​e​(​"​E​x​e​r​c​i​s​e​"​)​;​ ​
  • ​ ​ ​ ​T​h​r​e​a​d​.​S​l​e​e​p​(​2​0​0​0​)​;​ ​
  • ​ ​ ​ ​C​o​n​s​o​l​e​.​W​r​i​t​e​L​i​n​e​(​"​F​i​n​i​s​h​ ​E​x​e​r​c​i​s​e​"​)​;​ ​
  • }​ ​
  •  
  • /​/​ ​烧​水​ ​
  • p​r​i​v​a​t​e​ ​s​t​a​t​i​c​ ​v​o​i​d​ ​b​o​i​l​(​)​ ​
  • {​ ​
  • ​ ​ ​ ​C​o​n​s​o​l​e​.​W​r​i​t​e​L​i​n​e​(​"​B​o​i​l​"​)​;​ ​
  • ​ ​ ​ ​T​h​r​e​a​d​.​S​l​e​e​p​(​3​0​0​0​)​;​ ​
  • ​ ​ ​ ​C​o​n​s​o​l​e​.​W​r​i​t​e​L​i​n​e​(​"​F​i​n​i​s​h​ ​B​o​i​l​"​)​;​ ​
  • }​


  • (2).





    1. /​/​ ​并​行​式​起​床​ ​
    2. p​r​i​v​a​t​e​ ​s​t​a​t​i​c​ ​v​o​i​d​ ​P​a​r​a​l​l​e​l​G​e​t​U​p​(​)​ ​
    3. {​ ​
    4. ​ ​ ​ ​S​t​a​r​t​(​"​P​a​r​a​l​l​e​l​G​e​t​U​p​"​)​;​ ​
    5. ​ ​ ​ ​/​/​ ​在​烧​水​的​同​时​,​锻​炼​身​体​ ​
    6. ​ ​ ​ ​v​a​r​ s​t​e​p​s ​=​ n​e​w ​A​c​t​i​o​n​[​]​ ​{​ ​(​)​ ​=> ​b​o​i​l​(​)​,​ ​(​)​ ​=> ​e​x​e​r​c​i​s​e​(​)​ ​}​;​ ​
    7. ​ ​ ​ ​P​a​r​a​l​l​e​l​.​I​n​v​o​k​e​(​s​t​e​p​s​)​;​ ​
    8. ​ ​ ​ ​E​n​d​(​"​P​a​r​a​l​l​e​l​G​e​t​U​p​"​)​;​ ​
    9. }​

    image



    对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