提问人:Ashish Negi 提问时间:1/19/2019 最后编辑:Theodor ZouliasAshish Negi 更新时间:8/5/2023 访问量:444
在浏览后从 ConcurrentQueue 中删除元素的模式 [duplicate]
Pattern to remove elements from ConcurrentQueue after peeking [duplicate]
问:
我有一个生产者和多个消费者。我正在使用 .我正在使用 C#,但我认为我的问题是与语言无关的。ConcurrentQueue
可以有非唯一使用者。也就是说,多个消费者可以对同一条消息感兴趣。因此,非唯一消费者就像是同类的工人。
也有唯一的使用者,由于他们正在处理队列,因此它们假定在消息中排序。
问题:
当消费者窥视队列并为自己找到消息 M1 时,它会将其取消排队。但是,由于并发性,消息 M1 可能已被 worker 取消排队。此时,由 取消排队的消息是 for 。 只有一个工作线程,因此,将消息放回队列中无济于事,因为它会破坏消息的顺序。Guid-1-worker-1
Guid-1-worker-2
Guid-1-worker-1
Guid-2
Guid-2
我想要的是,如果我查看了一条消息,那么只有我应该能够将其取消排队。现在,我想我必须在这里使用。但简单也会起作用。lock
List
ConcurrentQueue
有没有其他数据结构提供:并发语义的种类?Peek-Check-Dequeue
有没有其他方法可以对问题进行建模?
答:
1赞
usr
1/20/2019
#1
Peek-Check-Dequeue
强制某种锁定。要么你锁定自己的数据结构执行锁定(它需要锁定,然后调用你的代码来执行检查,然后解锁)。
没有任何内置或常用的来帮助解决这个问题。只需自己上锁即可。
如果此类操作的频率非常高(每秒数百万次),则锁定开销将成为一个问题。在这一点上,你需要一个更聪明的设计。这将是更多的工作和更大的错误风险。
评论