3

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

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

也有独特的消费者,因为他们正在处理一个队列,他们假设消息中的顺序。

问题:

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

我想要的是,如果我查看了一条消息,那么只有我应该能够将它出列。现在,我想我必须在lock这里使用。但简单List会起作用,而不是ConcurrentQueue同样有效。

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

有没有其他方法来模拟问题?

4

1 回答 1

0

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

没有任何内置或常用来帮助解决此问题。自己锁就好了。

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

于 2019-01-20T10:34:30.897 回答