探究Visual Studio 2010中Parallel的使用(4)

發表于:2010-03-25來源:作者:點擊數: 標簽:Parallel探究StudioVisualvisual
探究Visual Studio 2010中Parallel的使用(4) 軟件測試 更復雜的任務之間的同步 我們在使用Barrier進行并行任務之間的同步時,有這樣一個 缺陷 ,我們需要預先知道所有需要同步的并行任務的數目,如果這個數目是隨機的,就無法使用Barrier進行任務之間的同步

  探究Visual Studio 2010中Parallel的使用(4)   軟件測試

  更復雜的任務之間的同步

  我們在使用Barrier進行并行任務之間的同步時,有這樣一個缺陷,我們需要預先知道所有需要同步的并行任務的數目,如果這個數目是隨機的,就無法使用Barrier進行任務之間的同步了。并行任務數目不定這種情況很常見。我們還是來看上文中看電影的例子,每場進電影院看電影的觀眾數目是不固定的,那么退場的觀眾也是不固定的,甚至還有中途退場的。當所有觀眾都退場后,我們需要打掃電影院的衛生。這里需要的同步的就是所有觀眾都退場。針對這種數目不定的多個并行任務,.NET Framework提供了CountdownEvent這個類來進行任務之間的同步。

  就像它的名字一樣,CountdownEvent基于這樣一個簡單的規則:當有新的需要同步的任務產生時,就調用AddCount增加它的計數,當有任務到達同步點是,就調用Signal函數減小它的計數,當CountdownEvent的計數為零時,就表示所有需要同步的任務已經完成,可以開始下一步任務了。下面我們利用CountdownEvent來模擬一下觀眾進場立場的情景。

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace CountdownEventDemo { // 觀眾類,用來表示一位觀眾 class Customer { public Customer(int nID) { m_nID = nID; } // 觀眾的ID public int m_nID; } class Program { static void Main(string[] args) { // 創建CountdownEvent同步對象 using (var countdown = new CountdownEvent(1)) { // 產生一個隨機數,表示觀眾的數目 Random countRandom = new Random(DateTime.Now.Millisecond); int nCount = countRandom.Next(10); // 構造每一位觀眾看電影的任務 Action[] seeafilm = new Action[ nCount ]; for (int i = 0; i < nCount; i++) { // 構造Customer對象,表示觀眾 Customer currentCustomer = new Customer( i+1 ); seeafilm[i] = () => { // 觀眾進場 countdown.AddCount(); Console.WriteLine("觀眾 {0} 進場。", currentCustomer.m_nID); // 模擬看電影的時間 Thread.Sleep(countRandom.Next(3000,6000)); // 觀眾退場 countdown.Signal(); Console.WriteLine("觀眾 {0} 退場。", currentCustomer.m_nID); }; } //并行執行任務 Parallel.Invoke( seeafilm ); // 在此同步,最后CountdownEvent的計數變為零 countdown.Signal(); countdown.Wait(); } Console.WriteLine("所有觀眾退場,開始打掃衛生。"); Console.ReadKey(); }

  在這段代碼中,我們使用CountdownEvent進行隨機個數任務之間的同步。最后,我們可以得到這樣的輸出。

圖3 使用CountdownEvent進行同步

  圖3 使用CountdownEvent進行同步

  通過Parallel.Invoke函數,我們可以輕松地將相互獨立的任務并行執行,同時通過Barrier和CountdownEvent類進行任務之間的同步。這種并行計算的開發方式,比以前那種基于線程的并行計算開發方式簡便很多,解放了程序員的腦袋,讓他們可以把更多的腦力放到業務邏輯問題的解決之上。使用Parallel類,多快好省地開發并行計算應用程序。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97