【问题标题】:When is a ConcurrentQueue needed?什么时候需要 ConcurrentQueue?
【发布时间】: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
  • 需要还是建议? when-to-use-a-thread-safe-collection

标签: c# .net multithreading concurrent-queue


【解决方案1】:

在我的游戏中,我有一个主线程来处理我的游戏逻辑,然后每个玩家都有另一个线程来执行侦听、序列化和发送数据的工作。

因此,您最终可能会遇到这样的情况,即在您将项目出列的确切时间,您还将一个项目入队到另一个线程中。在这种情况下,由于the unsafe code in Dequeue(特别是更新可能不同步的类成员),排队的项目可能会丢失。此外,调整后备数组的大小可能会导致项目丢失...

您需要ConcurrentQueue

【讨论】:

  • 这正是我需要知道的,所以它需要它被多个线程使用的那一刻,对吧?
  • 除非你有更好的锁定机制。
猜你喜欢
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 2018-12-10
  • 2010-12-29
  • 2017-07-13
  • 2012-08-21
  • 2011-08-18
  • 1970-01-01
相关资源
最近更新 更多