我有一个生产者和多个消费者。我正在使用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
种并发语义?
还有其他方法可以对问题进行建模吗?
答案 0 :(得分:0)
Peek-Check-Dequeue
强制某种锁定。要么您自己锁定数据结构,要么执行锁定(它需要先锁定,然后调用代码执行检查,然后再解锁)。
没有内置的或常用的工具可以帮助您解决此问题。只需自己锁定即可。
如果此类操作的频率很高(每秒数百万次),则锁定开销将成为问题。到那时,您将需要一个更巧妙的设计。那将需要更多的工作,并且会产生更多的错误。