.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物件使用在平行運算的程式碼當中,就不會有前述的錯誤發生!!!
沒有留言:
張貼留言