2012-06-25 51 views

回答

4

如果您使用的是.NET 4.0,則可以使用ConcurrentQueue。這是推薦的方法。

關於Queue<T>本身的MSDN頁說以下(向下滾動到Thread Safety部分:

隊列可以支持多個讀者同時,只要集合不會被改動即便如此,枚舉通過一個集合本質上不是一個線程安全的過程爲了保證枚舉過程中的線程安全,你可以在整個枚舉過程中鎖定集合爲了讓集合可以被多個線程訪問來讀寫,你必須實現自己的同步。

除了這些解決方案,您還可以實現您自己的線程安全隊列。實現線程安全的一種方法是不變性(儘管這將涉及一些鎖定)。您可以在Eric Lippert的博客here上閱讀有關編寫不可變隊列的內容。或者,您可以使用F#-based data types,其中大部分是不可變的。

+0

我以爲這是一個無鎖的[this](http://www.codeproject.com/Articles/43510/Lock-Free-Single-Producer-Single-Consumer-Circular) – enzom83

1

如果您運行的是.NET 4,最簡單的方法是直接從Microsoft使用ConcurrentQueue。 :)

2

如果您正在實施從您提到的生產者/消費者的消費者,那麼BlockingCollection是你的朋友。否則,正如其他人所說,ConcurrentQueue。 BlockingCollection允許您在沒有要刪除的元素時調用.Take(),並將其阻止,只需使用while (true)即可簡化消費者循環。

相關問題