Шаблон для удаления элементов из параллельной очереди после просмотра

У меня один производитель и несколько потребителей. Я использую 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 заставляет какой-то замок. Либо вы сами блокируете, что структура данных выполняет блокировку (потребуется блокировка, затем вызов вашего кода, чтобы выполнить проверку, а затем разблокировку).

Нет ничего встроенного или обычно используемого, чтобы помочь с этим. Просто сделайте блокировку самостоятельно.

Если у вас очень высокая частота таких операций (миллионы в секунду), тогда возникают проблемы с блокировкой. На этом этапе вам понадобится более умный дизайн. Это было бы больше работы и больше риска для ошибок.

Другие вопросы по тегам