Шаблон для удаления элементов из параллельной очереди после просмотра - PullRequest
0 голосов
/ 19 января 2019

У меня один производитель и несколько потребителей.Я использую 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 Ответ

0 голосов
/ 20 января 2019

Peek-Check-Dequeue вызывает некоторую блокировку. Либо вы сами блокируете, что структура данных выполняет блокировку (потребуется блокировка, затем вызов вашего кода для выполнения проверки, а затем разблокировка).

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...