窥视后从并发队列中删除元素的模式

时间:2019-01-19 04:35:06

标签: c# concurrency concurrent-queue

我有一个生产者和多个消费者。我正在使用ConcurrentQueue。我正在使用C#,但我认为我的问题是语言不可知论。

可能存在非唯一的消费者。即,一个以上的消费者可能对同一条消息感兴趣。因此,非唯一的消费者就像是一类工人。

也有唯一的使用者,并且由于他们正在处理队列,因此它们假定消息中的顺序。

问题:

当消费者Guid-1-worker-1窥视队列并为其自身找到消息M1时,它将出队。但是,由于并发,消息M1可能已由工作线程Guid-1-worker-2出队。此时,由Guid-1-worker-1出队的消息是针对Guid-2的。 Guid-2只有一名工作人员,因此,将消息放回队列中无济于事,因为它会破坏消息的顺序。

我想要的是,如果我查看了一条消息,那么只有我应该能够将其出队。现在,我认为我必须在这里使用lock。但是简单的List也会代替ConcurrentQueue起作用。

是否还有其他数据结构可以提供:Peek-Check-Dequeue种并发语义?

还有其他方法可以对问题进行建模吗?

1 个答案:

答案 0 :(得分:0)

Peek-Check-Dequeue强制某种锁定。要么您自己锁定数据结构,要么执行锁定(它需要先锁定,然后调用代码执行检查,然后再解锁)。

没有内置的或常用的工具可以帮助您解决此问题。只需自己锁定即可。

如果此类操作的频率很高(每秒数百万次),则锁定开销将成为问题。到那时,您将需要一个更巧妙的设计。那将需要更多的工作,并且会产生更多的错误。