偷看后从并发队列中删除元素的模式

Pattern to remove elements from concurrentqueue after peeking

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

可以有非唯一消费者。即不止一个消费者可能对同一消息感兴趣。因此,非独特的消费者就像同类工人。

也有独特的消费者,因为他们处理的是队列,所以他们假设消息是有序的。

问题:

当消费者 Guid-1-worker-1 查看队列并为自己找到一条消息 M1 时,它将使它出列。但是,由于并发性,消息 M1 可能已被 worker Guid-1-worker-2 出列。此时,Guid-1-worker-1 出队的消息是给 Guid-2 的。 Guid-2 只有一名工作人员,因此将消息放回队列无济于事,因为它会打乱消息的顺序。

我想要的是,如果我查看了一条消息,那么只有我能够将它出队。现在,我想我必须在这里使用 lock。但是简单的 List 也可以代替 ConcurrentQueue

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

是否有任何其他方法来模拟问题?

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

没有任何内置或常用的东西可以帮助解决这个问题。自己上锁就好了。

如果此类操作的频率非常高(每秒数百万次),那么锁定开销就会成为一个问题。那时你需要一个更聪明的设计。那将是更多的工作和更多的错误风险。