我需要一個可以同時被2個線程訪問的隊列,一個隊列可以排隊一個項目,而另一個隊列將另一個項目排隊。 Queue<T>
課程是否符合此要求?或者我應該從頭開始實現它(例如使用單個生產者/消費者循環隊列實現,如this)?如何建立一個可以被2個線程同時訪問的隊列?
1
A
回答
4
如果您使用的是.NET 4.0
,則可以使用ConcurrentQueue。這是推薦的方法。
關於Queue<T>
本身的MSDN頁說以下(向下滾動到Thread Safety
部分:
隊列可以支持多個讀者同時,只要集合不會被改動即便如此,枚舉通過一個集合本質上不是一個線程安全的過程爲了保證枚舉過程中的線程安全,你可以在整個枚舉過程中鎖定集合爲了讓集合可以被多個線程訪問來讀寫,你必須實現自己的同步。
除了這些解決方案,您還可以實現您自己的線程安全隊列。實現線程安全的一種方法是不變性(儘管這將涉及一些鎖定)。您可以在Eric Lippert的博客here上閱讀有關編寫不可變隊列的內容。或者,您可以使用F#-based data types,其中大部分是不可變的。
1
如果您運行的是.NET 4,最簡單的方法是直接從Microsoft使用ConcurrentQueue
。 :)
2
如果您正在實施從您提到的生產者/消費者的消費者,那麼BlockingCollection是你的朋友。否則,正如其他人所說,ConcurrentQueue。 BlockingCollection允許您在沒有要刪除的元素時調用.Take(),並將其阻止,只需使用while (true)
即可簡化消費者循環。
相關問題
- 1. 2個進程是否可以訪問同一個列表?
- 2. 如何使用1個線程的django可以同時訪問?
- 3. 如何實現一個可以被多個線程處理的隊列?
- 4. 如何訪問隊列中的一個線程 - Java的
- 5. 2個線程如何能夠同時訪問同步塊?
- 6. 兩個線程可以同時訪問同步方法嗎?
- 7. 多個同時訪問單個線程
- 8. 創建一個可以訪問app_globals的掛鉤線程
- 9. 創建一個線程隊列
- 10. 被多個線程訪問
- 11. 多個線程可以同時訪問共享內存嗎?
- 12. 兩個線程訪問同一個LinkedList
- 13. C++:使一個DLL可以同時訪問多個進程
- 14. 如何一次訪問2個列表,同時展望izip_longest? -python
- 15. 現代解決跨線程或隊列訪問一個的NSManagedObjectContext
- 16. 2個線程的C++隊列
- 17. 可以同時訪問最多3個線程的java多線程方法
- 18. 同時訪問多個線程的SQLitedatabase
- 19. ABAddressBook可以在同一個串行隊列上由多個線程使用嗎?
- 20. 兩個線程同時訪問同一個ArrayList?
- 21. 可以在Windows天青服務總線隊列可以被訪問隨機
- 22. 如何創建臨時隊列並在JMS中訪問它2
- 23. Python - 線程 - 我可以創建線程隊列列表嗎?
- 24. 使用Python建立一個隊列
- 25. 2 vb.net中的線程 - 無法同時訪問同一類
- 26. 如何在Delphi Xe2中創建一個線程隊列?
- 27. 如何創建一個存儲隊列一個多隊列?
- 28. 如何使一個用戶可以在c中同時訪問一個方法#
- 29. 在一個web應用程序中使用RabbitMQ,多個線程可以在同一個隊列上工作
- 30. 2線程在同一時間訪問到同步功能
我以爲這是一個無鎖的[this](http://www.codeproject.com/Articles/43510/Lock-Free-Single-Producer-Single-Consumer-Circular) – enzom83