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

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

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

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


person user2301299    schedule 20.04.2013    source источник


Ответы (1)


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

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

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

person Colonel Panic    schedule 20.04.2013
comment
+1. Информацию об идеальной очереди приоритетов C++ см. в документации по адресу std::priority_queue<>. При использовании набора инструментов, совместимого с C++11, стандартная библиотека поддержки потоков, скорее всего, будет также быть информативным и полезным. - person WhozCraig; 20.04.2013
comment
Разве это не какой-то шаблон активного объекта (POSA)? Я думаю, я мог бы пойти по этому шаблону и сделать список активации приоритетной очередью. - person user2301299; 20.04.2013
comment
Я использую С++ (я имею в виду не С++ 11). Я также могу использовать boost. - person user2301299; 20.04.2013
comment
Только что просмотрел Википедию, и кажется, что в Active Object Pattern есть все, что вам нужно. Boost имеет массу отличных утилит и структур данных, так что вам должно быть хорошо. - person Colonel Panic; 20.04.2013