Синхронизировать асинхронные вызовы из более чем одного объекта

У меня около 10 предметов. У каждого объекта свой класс. Запросы к этим объектам (вызовы методов с возвращаемыми значениями) поступают из разных потоков.

Мне нужно синхронизировать те вызовы методов, которые должны выполняться только один раз. Некоторые запросы имеют более высокий приоритет, чем другие. Это означает, что если имеется больше запросов, ожидающих выполнения, и отправляется еще один — с более высоким приоритетом, чем любой другой, ожидающий выполнения, он должен быть выполнен следующим.

Я не знаю, как решить эту проблему в C ++. Я думал о шаблоне Command, но это потребовало бы много «ручного» кодирования. Я должен был бы преобразовать каждый вызов метода в объект команды. И проблема с возвращаемым значением.
У кого-нибудь есть идея, какой шаблон можно использовать здесь?

2

Решение

Для синхронизации вы можете использовать некоторую форму взаимное исключение так что только один поток за раз манипулирует объектом.

Имея дело с приоритетами, вы, вероятно, захотите приоритетная очередь с компаратором для определения критериев, для которых тип запроса имеет больший приоритет.

Каждый объект будет принимать запрос на выполнение действия, и он будет иметь связанный с ним приоритет и действие (как вы предложили в шаблоне команды). Используя механизм блокировки, он обновит очередь с приоритетами, добавив запись, а затем освободит ее. Он должен заблокировать очередь, потому что доступ к ней осуществляется через несколько потоков. Никакой явной сортировки не требуется — очередь всегда в порядке наивысшего приоритета. Поэтому для обработки команды просто получите первый элемент в очереди, если таковой имеется, и выполните действие.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector