我需要一个可以同时被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