У меня один производитель и несколько потребителей.Я использую ConcurrentQueue.Я использую C #, но я думаю, что моя проблема - языковая независимость.
Могут быть неуникальные потребители.то есть более одного потребителя могут быть заинтересованы в одном и том же сообщении.Таким образом, неуникальные потребители похожи на работников одного типа.
Также есть уникальные потребители, и, поскольку они имеют дело с очередью, они предполагают упорядочение в сообщениях.
Проблема:
Когда потребитель Guid-1-worker-1
заглядывает в очередь и находит для себя сообщение M1, он удаляет его из очереди.Однако из-за параллелизма сообщение M1 могло быть удалено рабочим Guid-1-worker-2
.В настоящее время сообщение, удаленное Guid-1-worker-1
, предназначено для Guid-2
.Guid-2
имеет только одного работника и, следовательно, помещение сообщения обратно в очередь не помогает, так как нарушает порядок сообщений.
Что я хочу, так это то, что если я посмотрел на сообщение, то только я долженбыть в состоянии снять с негоТеперь я думаю, что я должен использовать lock
здесь.Но простой List
будет работать вместо ConcurrentQueue
.
Существует ли какая-либо другая структура данных, которая обеспечивает: Peek-Check-Dequeue
вид параллельной семантики?
Есть ли другой способ моделирования проблемы?