当我意识到某些项目被多次加工时,我正在使用ConcurrentQueue管理要并行加工的项目队列。
我坚信ConcurrentQueue是线程安全的,但现在我有一个疑问,如果TryDequeue方法同时并行访问,是否可以在不同线程中两次返回同一项?
修改 我不是在问为什么我的代码不起作用,所以假装一个可复制的示例是没有用的,但是是的,这个问题有点愚蠢,您可以在Microsoft documentation上轻松找到答案:
答案 0 :(得分:4)
否,一个项目只能由一个线程出队。 ConcurrentQueue管理并发。
ConcurrentQueue在内部处理所有同步。如果两个线程恰好在同一时间调用TryDequeue,则不会阻塞任何操作。当两个线程之间检测到冲突时,一个线程必须再次尝试检索下一个元素,并且同步在内部进行处理。
答案 1 :(得分:2)
The docs不同意:
TryDequeue
尝试从队列中删除一个元素。如果该方法成功,则删除该项目,该方法返回true
;否则,返回false
。对于队列中的其他操作,这是原子发生的。如果队列中填充了诸如q.Enqueue("a"); q.Enqueue("b"); q.Enqueue("c");
之类的代码,并且两个线程同时尝试出队,则一个线程将出队a
,另一个线程将出队b
。两次调用TryDequeue
都将返回true
,因为它们都可以使元素出队。
如果您看到与此不同的行为,我们将需要一个复制它的示例。我怀疑您的问题出在其他地方。