c++ - 使用 boost::asio poll 避免忙等待

标签 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";
    }
}

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

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

服务在单线程上使用async io,其他线程做数据处理。

我在循环迭代之间添加了一个 sleep ,这似乎减少了 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";
    }
}

最佳答案

我想说的是,简单地利用 boost::asio::io_service 默认情况下完全线程安全的事实,然后做

iosvc.run();

然后像您一样在“服务中的另一个线程”上发出服务关闭信号:

iosvc.stop();

根据文档,请记住在再次调用 {run,poll}[_one] 之前执行 iosvc.reset()

当然你也可以使用其他方式来通知实际的逻辑 worker 结束,但那是完全独立的,与 Boost Asio 无关

关于c++ - 使用 boost::asio poll 避免忙等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26272185/

相关文章:

c++ - std::enable_if 的替代方案和模板模板参数的显式重载

concurrency - Go 超时 sleep 但不忙等待

java - 并发编程,线程之间共享值

java - 如何在 Java 中表示静态结构

c++ - Qt - 覆盖 QTreeView::drawBranches()

c++ - 提升在多个线程上运行的 asio strand 和 io_service

c++ - 将 boost::asio tcp 示例移植到 C++11

c++ - 实现一个条件变量来解决多线程忙等待

c++ - 使用 map<int, Foo> 而不是 vector<Foo> 来避免指针失效

c++ - Boost.Asio、tcp::iostream 和多线程