【发布时间】:2017-10-24 09:52:03
【问题描述】:
我在问这个问题:Using events on multithreading socket server
我已经实现了一个ConcurrentQueue,认为需要它来避免多线程问题。执行此操作时,我注意到与标准 Queue 的唯一区别在于 Dequeue() 方法,要求 out 参数。
这让我觉得唯一的保护是在使对象出队的线程中,这是真的吗?
在我的游戏中,我有一个主线程来处理我的游戏逻辑,然后每个玩家都有另一个线程来执行侦听、序列化和发送数据的工作。
所以我的ConcurrentQueue 将被不同的线程入队和出队,但只有一个并且总是相同的线程会调用入队或出队。
所以我认为我可以使用简单的队列吗?
只有在从多个线程同时调用Dequeue() 时才需要ConcurrentQueue?
【问题讨论】:
-
在一般队列中,您需要一个锁定语句(它为一个线程锁定整个队列),然后您入队/出队。而对于 ConcurrentQueue,您不需要专门锁定,因为 Enqueue/Dequeue 将具有必要的项目级别锁定。
-
“简单队列”通常是问题所在。不是排队难做,而是在队列空的时候做一些明智的事情。 ConcurrentQueue 负责处理这一点并避免必须理解mysteries of Monitor.Pulse。
标签: c# .net multithreading concurrent-queue