偷看后从并发队列中删除元素的模式
Pattern to remove elements from concurrentqueue after peeking
我有一个生产者和多个消费者。我正在使用并发队列。我正在使用 C#,但我认为我的问题是语言不可知论。
可以有非唯一消费者。即不止一个消费者可能对同一消息感兴趣。因此,非独特的消费者就像同类工人。
也有独特的消费者,因为他们处理的是队列,所以他们假设消息是有序的。
问题:
当消费者 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#,但我认为我的问题是语言不可知论。
可以有非唯一消费者。即不止一个消费者可能对同一消息感兴趣。因此,非独特的消费者就像同类工人。
也有独特的消费者,因为他们处理的是队列,所以他们假设消息是有序的。
问题:
当消费者 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
强制某种锁定。要么你自己锁定数据结构执行锁定(它需要锁定,然后调用你的代码执行检查,然后解锁)。
没有任何内置或常用的东西可以帮助解决这个问题。自己上锁就好了。
如果此类操作的频率非常高(每秒数百万次),那么锁定开销就会成为一个问题。那时你需要一个更聪明的设计。那将是更多的工作和更多的错误风险。