Шаблон для удаления элементов из параллельной очереди после просмотра
У меня один производитель и несколько потребителей. Я использую 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
вид параллельной семантики?
Есть ли другой способ смоделировать проблему?
1 ответ
Peek-Check-Dequeue
заставляет какой-то замок. Либо вы сами блокируете, что структура данных выполняет блокировку (потребуется блокировка, затем вызов вашего кода, чтобы выполнить проверку, а затем разблокировку).
Нет ничего встроенного или обычно используемого, чтобы помочь с этим. Просто сделайте блокировку самостоятельно.
Если у вас очень высокая частота таких операций (миллионы в секунду), тогда возникают проблемы с блокировкой. На этом этапе вам понадобится более умный дизайн. Это было бы больше работы и больше риска для ошибок.