boost :: asio io_service thread pool

Как правильно использовать настройки пула потоков для io_service? Эти 2 оператора из документации сбивают меня с толку:

io_service :: run

Обычный выход из функции run () подразумевает, что объект io_service остановлен (функция Stop () возвращает правда). Последующие вызовы run (), run_one (), poll () или poll_one () вернутся немедленно, если не было предыдущего вызова reset ().

io_service :: reset

Эта функция должна вызываться до любого второго или более позднего набора вызовов функций run (), run_one (), poll () или poll_one (), когда предыдущий вызов этих функций возвращал из-за остановки или неработоспособности io_service.

Вот что я сейчас делаю:

boost::thread_group     m_Threads;
boost::asio::io_service m_IoService;
boost::barrier          m_Barrier(numThreads);

for( unsigned int i = 0; i < numThreads; ++i )
{
    m_Threads.create_thread(
        [&]()
        {
            for(;;)
            {
                m_IoService.run();

                if( m_Barrier.wait() )  //  will only return true for 1 thread
                {
                    m_IoService.reset();
                }
                m_Barrier.wait();
            }
        });
}

m_IoService.stop();
m_Threads.interrupt_all();
m_Threads.join_all();

Кажется, все работает нормально, если я просто помещаю m_IoService.run () в бесконечный цикл (что, по-видимому, указывает в документации, не должно быть в случае). Какой правильный способ?

15
задан David 31 October 2011 в 17:13
поделиться