公告資訊

未經授權,禁止轉載網站文章與內容。如有需要可以跟我聯絡,謝謝!!




2010年11月16日 星期二

在多執行緒/平行運算中使用集合

 

.NET Framework 4.0 當中,其中一項很重要的特色,就是加入了對於平行運算的支援,讓你的應用程式可以發揮多核處理器的運算能力,甚至於搭配Windows HPC Server 2008 R2進行分散式運算。使用.NET Framework 4.0當中的Task Parallel Library,C#與VB.NET所建立的程式很容易就寫出在多核的環境中執行平行運算的程式。

然而,在平行運算的的程式使用集合一向是個問題,因為在.NET Framework 4.0以前所提供的集合物件,都不是執行緒安全(thread-safe)的物件;換句話說,在平行運算的程式中使用,必須要透過特別的同步鎖定(synchronization)寫法,才可以正常的使用集合中的資料。

這一個問題,.NET Framework 4.0 提供了解決的方式。在.NET Framework 4.0當中,加入了 System.Collections.Concurrent 命名空間,提供了許多可以使用在平行運算程式當中的執行緒安全(thread-safe)集合類別,包括了:

  • BlockingCollection
  • ConcurrentBag
  • ConcurrentDictionary
  • ConcurrentQueue
  • ConcurrentStack
  • OrderablePartitioner
  • Partitioner

在支援平行運算的程式碼當中,只需要將原本使用的集合換成新的集合就可以了。例如原本的程式碼:

pulblic class MyData{

public List<byte[]> Data {get; set;}

}

因為 List集合物件不支援執行緒安全,因此當你將MyData物件直接在平行運算的程式中使用,並且沒有特別同步鎖定的話,可能會出現下面的錯誤:

System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at System.Collections.Generic.List`1.Enumerator.MoveNext()

而在.NET Framework 4.0 的程式當中,你可以將 List集合換成 BlockingCollection集合物件:

pulblic class MyData{

public BlockingCollection<byte[]> Data {get; set;}

}

因為 BlockingCollection物件本身就支援執行緒安全,因此直接將BlockingCollection物件使用在平行運算的程式碼當中,就不會有前述的錯誤發生!!!

沒有留言:

最新回應

Loading...

即時與版主對話


(若狀態顯示"忙碌"時,我可能無法馬上回應。你可以留下Email,我會盡快跟你聯絡,謝謝喔!!)