У меня логика обработки сообщений следующая:
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 потоками. Можно ли заставить элемент обрабатываться определенным потоком? Или же мне нужно поддерживать одну очередь на поток, иметь дело с блокировкой мьютекса и т. Д.
Есть ли лучший способ?