ConcurrentQueue <T>是否可以多次使同一项目出队?

时间:2019-10-16 13:15:16

标签: c# multithreading

当我意识到某些项目被多次加工时,我正在使用ConcurrentQueue管理要并行加工的项目队列。

我坚信ConcurrentQueue是线程安全的,但现在我有一个疑问,如果TryDequeue方法同时并行访问,是否可以在不同线程中两次返回同一项?

修改 我不是在问为什么我的代码不起作用,所以假装一个可复制的示例是没有用的,但是是的,这个问题有点愚蠢,您可以在Microsoft documentation上轻松找到答案:

2 个答案:

答案 0 :(得分:4)

否,一个项目只能由一个线程出队。 ConcurrentQueue管理并发。

  

ConcurrentQueue在内部处理所有同步。如果两个线程恰好在同一时间调用TryDequeue,则不会阻塞任何操作。当两个线程之间检测到冲突时,一个线程必须再次尝试检索下一个元素,并且同步在内部进行处理。

ConcurrentQueue.TryDequeue

答案 1 :(得分:2)

The docs不同意:

  

TryDequeue尝试从队列中删除一个元素。如果该方法成功,则删除该项目,该方法返回true;否则,返回false。对于队列中的其他操作,这是原子发生的。如果队列中填充了诸如q.Enqueue("a"); q.Enqueue("b"); q.Enqueue("c");之类的代码,并且两个线程同时尝试出队,则一个线程将出队a,另一个线程将出队b。两次调用TryDequeue都将返回true,因为它们都可以使元素出队。

如果您看到与此不同的行为,我们将需要一个复制它的示例。我怀疑您的问题出在其他地方。