Многопоточная обработка с сохранением частичной последовательности - PullRequest
0 голосов
/ 07 марта 2019

У меня логика обработки сообщений следующая:

boost::asio::io_service ioService;
boost::thread_group threadPool;

// Initialization code.
int noOfCores = boost::thread::hardware_concurrency();
for (int i = 0 ; i < noOfCores ; i ++)
{
    threadPool.create_thread(boost::bind(&boost::asio::io_service::run, , &ioService)); 
}

Позже в ветке чтения сокетов я получаю сообщения и отправляю функцию обработчика, связывая полученное сообщение.

ioService.post(boost::bind(MessageHandler, message));

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

Например, допустим, у меня есть сообщения типа A, B, C, D, E, F, G, H, I & J. Мне все равно, в каком порядке они обрабатываются, поэтому многопоточная обработка идеально. Тем не менее, мне нужно, чтобы сообщения одного типа обрабатывались последовательно. Допустим, я получил сообщения в следующем порядке.

С1, Е1, F1, А1, В1, С2, В2, D1, D2, F2, А2, Н1, Н2, А3, Е2, Е3, F3

Здесь алфавиты - это тип, а цифры - последовательность их прибытия. Различные типы сообщений могут обрабатываться параллельно в любом порядке, последовательность внутри типа должна поддерживаться. Я хочу, чтобы А1 обрабатывался до А2, а А2 до А3. Одинаково для всех типов сообщений.

Одним из способов может быть обеспечение того, чтобы сообщения данного типа всегда отправлялись в один и тот же поток. Это не очень эффективно. Если у меня только 5 типов сообщений и 32 ядра процессора, я все равно буду ограничен 5 потоками. Можно ли заставить элемент обрабатываться определенным потоком? Или же мне нужно поддерживать одну очередь на поток, иметь дело с блокировкой мьютекса и т. Д.

Есть ли лучший способ?

1 Ответ

1 голос
/ 07 марта 2019

Вы можете использовать прядь для каждого типа работы в качестве своей очереди.Таким образом, ваша работа может быть равномерно распределена по потокам io_context, что обеспечивает последовательную очередь работ для каждого типа работы и не требует блокировки мьютекса.

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