我有一个生产者和多个消费者。我正在使用ConcurrentQueue。我正在使用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类型的并发语义?
有没有其他方法来模拟这个问题?
发布于 2019-01-20 18:34:31
Peek-Check-Dequeue强制使用某种锁。要么你锁定自己的数据结构来执行锁定(它需要锁定,然后调用你的代码执行检查,然后解锁)。
没有任何内置的或常用的东西来帮助实现这一点。你自己上锁就行了。
如果这类操作的频率非常高(每秒数百万次),那么锁定开销就会成为一个问题。在这一点上,你需要一个更聪明的设计。这将是更多的工作和更多的bug风险。
https://stackoverflow.com/questions/54264091
复制相似问题