Как с помощью 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);
}
  • Вопрос задан
  • 2810 просмотров
Пригласить эксперта
Ответы на вопрос 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.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
27 нояб. 2024, в 13:07
10000 руб./за проект
27 нояб. 2024, в 12:53
70000 руб./за проект
27 нояб. 2024, в 12:50
25000 руб./за проект