Boost Asio — Как узнать, когда очередь обработчика пуста?

В настоящее время я отправляю обработчики в мой io_service и выполняю их в пуле потоков.

io_serv.post( boost::bind(&Class::bar, p1, p2) );

Мои работники запускают эту функцию:

m_mutex.lock();
std::cout << "[" << boost::this_thread::get_id()
<< "] Thread Start" << std::endl;
m_mutex.unlock();

size_t tasks = m_serv.run();

m_mutex.lock();
std::cout << "[" << boost::this_thread::get_id() << "] accomplished "<< tasks << " tasks" << std::endl;
m_mutex.unlock();

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

Возможно ли это и как?

2

Решение

Впервые вижу использование ASIO в качестве диспетчера очереди. Не плохая техника, я думаю.

Ну, я предлагаю вам бежать io_service :: бежать обслуживать обработчиков. Как документация говорит, бежать будет блокироваться до тех пор, пока io_service не будет остановлен ИЛИ не завершена вся работа. Таким образом, вы можете запустить «событие пустой очереди» после io_service :: бежать:

while( !finished ) {
io_serv.run();
io_serv.reset();
io_serv.post( boost::bind(&Class::fill_queue, instance) );
}

Это на тот случай, если у вас нет других действий asio в этом io_service и вы не используете io_service :: work.

Как уже упоминалось в комментариях, которые вы используете io_service :: работа так что план A провалился (он не будет работать, так как этот класс предотвращает выход в пустую очередь). Ну, вы можете сделать io_serv.post() после каждой связки io_serv.post()-s для потоковых работ. Обработчик может содержать ожидание с повышение :: состояние в то время как другие темы заканчивают свою работу. Как ты делаешь post() для этого после фактической работы, я думаю, Asio позвонит после отправки всех работ, но это предмет для расследования. В любом случае, этот обработчик можетpost() Сам освободить текущий поток, если условие еще не готово.

Но я думаю, что самый простой способ — это заменить io_service :: работа с равносторонним в то время как построить.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector