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

标签 c# concurrency concurrent-queue

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

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

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

问题:

当消费者 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 强制某种锁定。要么你自己锁定数据结构执行锁定(它需要锁定,然后调用你的代码来执行检查,然后解锁)。

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

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

关于c# - 偷看后从并发队列中删除元素的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54264091/

相关文章:

c# - 添加到自定义类类型列表的问题

c# - .Net 的 Windows API 包装器?

Java:在父类(super class)方法上同步

c++ - 如何多线程队列处理

c# - 为什么 ConcurrentQueue 和 ConcurrentDictionary 有 "Try"方法——TryAdd、TryDequeue——而不是 Add 和 Dequeue?

c# - 线程修改意外变量

c# - Linq Boolean 返回异常 DROPDOWNLIST 有一个无效的 SelectedValue,因为它不存在于项目列表中

与 SQLITE 的并发

git - 如果第二次推送只有第一次推送的快进,并发 git 推送是否总是安全的?

ios - 在 iOS 中执行大量服务器请求的并发队列与串行队列