在浏览后从 ConcurrentQueue 中删除元素的模式 [duplicate]

Pattern to remove elements from ConcurrentQueue after peeking [duplicate]

提问人:Ashish Negi 提问时间:1/19/2019 最后编辑:Theodor ZouliasAshish Negi 更新时间:8/5/2023 访问量:444

问:

我有一个生产者和多个消费者。我正在使用 .我正在使用 C#,但我认为我的问题是与语言无关的。ConcurrentQueue

可以有非唯一使用者。也就是说,多个消费者可以对同一条消息感兴趣。因此,非唯一消费者就像是同类的工人。

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

问题:

当消费者窥视队列并为自己找到消息 M1 时,它会将其取消排队。但是,由于并发性,消息 M1 可能已被 worker 取消排队。此时,由 取消排队的消息是 for 。 只有一个工作线程,因此,将消息放回队列中无济于事,因为它会破坏消息的顺序。Guid-1-worker-1Guid-1-worker-2Guid-1-worker-1Guid-2Guid-2

我想要的是,如果我查看了一条消息,那么只有我应该能够将其取消排队。现在,我想我必须在这里使用。但简单也会起作用。lockListConcurrentQueue

有没有其他数据结构提供:并发语义的种类?Peek-Check-Dequeue

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

C# 语言无关的 生产者-使用者 并发队列

评论


答:

1赞 usr 1/20/2019 #1

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

没有任何内置或常用的来帮助解决这个问题。只需自己上锁即可。

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