Как управлять пулом потоков в реализации Boost / C ++ - PullRequest
0 голосов
/ 02 мая 2018

Я работаю над действительно базовым приложением, чтобы узнать о пулах потоков и возможности управлять ими в c ++ с помощью boost.

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

void printStuff(int x){

    while(true){    
        std::cout <<" Hi from thread 1 in group " << x << std::endl;        
        boost::this_thread::sleep( boost::posix_time::milliseconds(1000) );
     }
}

void pstwo(int x){
    while(true){    
        std::cout <<" Hi from thread 2 in group " << x << std::endl;    
        boost::this_thread::sleep( boost::posix_time::milliseconds(1500) );
     }
 }

int main()
{
    boost::asio::io_service io_service;

    boost::asio::io_service::work work(io_service);

    boost::asio::io_service io_service2;

    boost::asio::io_service::work work2(io_service2);

    boost::thread_group threads;
    boost::thread_group threadsTwo;
    for (std::size_t i = 0; i < 2; ++i)
      threads.create_thread(boost::bind(&boost::asio::io_service::run, &io_service));

    for (std::size_t i = 0; i < 2; ++i)
      threadsTwo.create_thread(boost::bind(&boost::asio::io_service::run, &io_service2));

    io_service.post(boost::bind(printStuff,1));
    io_service.post(boost::bind(pstwo,1));

    io_service2.post(boost::bind(printStuff,2));
    io_service2.post(boost::bind(pstwo,2));

    boost::this_thread::sleep( boost::posix_time::milliseconds(10000));
    io_service.stop();
    std::cout<<"------------------"<<std::endl;
    boost::this_thread::sleep( boost::posix_time::milliseconds(10000));
    io_service.run();    
    io_service2.stop();
    std::cout<<"-----------------"<<std::endl;
    boost::this_thread::sleep( boost::posix_time::milliseconds(10000));
    io_service.stop();
    threads.join_all();
    threadsTwo.join_all();
    return 0;
}

Вызов io_service.stop фактически не останавливает ни один из потоков в пуле потоков.

1 Ответ

0 голосов
/ 02 мая 2018

Проблема, почему потоки не останавливаются, заключается в том, что когда вы останавливаете io_service, он фактически прекращает выполнение цикла обработки событий, как только это становится возможным. Но текущее событие представляет собой бесконечный цикл. Я думаю, вы должны использовать, например, atomic_bool, чтобы установить какое-то состояние «остановки» и проверить это состояние внутри потоков.

Кстати, вы должны использовать io_service.reset() между stop() и run().

...