Как с помощью boost сделать обработку post сообщений в рабочем потоке?

Необходимо обрабатывать сообщения в порядке их вызовов.
Грубо говоря аналог WaitForMultipleObjects на Win32, только с помощью boost.

Например:
/////////// UPDATE ///////////

void thread()
{
	while (true) {
		switch (event) {
		case do_event1:
			// something code...
		break;
		case do_event2:
			// something code...
		break;
		case close_event:
			// terminate thread...
		return;
		}
	}
}

//...

void FooClass1::addMessage()
{
	// something code...
	post_event(do_event1);
}

//...

void FooClass2::addMessage()
{
	// something code...
	post_event(do_event2);
}
  • Вопрос задан
  • 2803 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Lol4t0
Если стоит задача выполнять некоторые действия в рабочем потоке (или пуле рабочих потоков), то можно воспользоваться библиотекой boost.asio, в частности, для того, чтобы выполнить некоторый код в отдельном пуле потоков, можно использовать io_service::dispatch или io_service::post Вообще можно посмотреть возможности boost.asio, возможно что-то еще может пригодиться.

Насколько я знаю, готовой библиотеки event-ов в boost нет. С другой стороны, ее не слишком сложно реализовать самостоятесльно, используя очередь и conditional variable. Такое решение предположительно будет более легковесным, но требует большей аккуратности при реализации, да и вообще велосипед.
Ответ написан
@vScherba
Вообще, ваш пример - это как раз наиболее правильный, современный и масштабируемый подход к взаимодействию потоков через обмен сообщениями. Он называется MPI (Message Passing Interface). В Erlang и D, например, используется как механизм по-умолчанию для взаимодействия потоков.
В boost как раз есть плюсовая обертка над MPI. Мне не приходилось ее использовать, в доках сразу же рассказывается, как это круто все работает между процессами. Подозреваю, что внутрипроцессный механизм там также присутствует в качестве частного случая.

Как сказал @Lol4t0, можно использовать boost::asio::io_service, хотя этот подход направлен больше на события завершения ввода/вывода (там реализация паттерна Proactor в чисто виде), но никто не запрещает использовать чисто dispatch или post и получить такое подобие MPI.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
26 апр. 2024, в 10:01
500 руб./за проект
26 апр. 2024, в 09:18
500 руб./в час
26 апр. 2024, в 06:46
1500 руб./в час