使用boost :: asio poll避免忙等待

时间:2014-10-09 07:00:03

标签: c++ boost-asio busy-waiting

我正在linux上编写一个服务,在while循环中使用boost :: asio :: io_service和io_service :: poll。这是一个繁忙的等待循环,例如它浪费了CPU周期。

void Application::run()
{
    try
    {
        std::cout << "TcpServer starting..\n";
        _TcpServer.reset( new TcpServer(_io_service, boost::ref(_spState)) );

        // _io_service.run();

        while( ! _spState->QuitSignalled() )
        {
            _io_service.poll(); 
        }

        std::cerr << "quit signalled, TcpServer stopping.. :/" << std::endl;
    }
    catch(std::exception & e)
    {
        std::cout << e.what() << "\n";
    }
}

我使用poll而不是run来检查服务中的另一个线程是否已发出服务关闭信号。

有没有办法在忙碌的等待循环中不使用轮询来实现这一点?

该服务在单个线程上使用async io,其他线程进行数据处理。

我在循环的迭代之间添加了一个睡眠,这似乎减少了cpu时间的浪费,但我希望可能有更有效的方法?

void Application::run()
{
    using boost::this_thread::sleep_for;

    static const boost::chrono::milliseconds napMsecs( 50 );

    try
    {
        std::cout << "TcpServer starting..\n";
        _TcpServer.reset( new TcpServer(_io_service, boost::ref(_spState)) );

        // _io_service.run();

        while( ! _spState->QuitSignalled() )
        {
            _io_service.poll();
            boost::this_thread::sleep_for( napMsecs );
        }

        std::cerr << "quit signalled, TcpServer stopping.. :/" << std::endl;
    }
    catch(std::exception & e)
    {
        std::cout << e.what() << "\n";
    }
}

1 个答案:

答案 0 :(得分:2)

我说,只是利用boost::asio::io_service默认情况下完全线程安全的事实,并且

iosvc.run();

信号服务关闭&#34;服务中的另一个线程&#34;像你一样:

iosvc.stop();

在根据文档再次致电iosvc.reset()之前,请记得{run,poll}[_one]

当然,您也可以使用其他方式表示实际的逻辑工作人员结束,但那时完全独立于Boost Asio