使用boost::asio::io_service运行避免繁忙循环

Avoiding busy loop with boost::asio::io_service run

本文关键字:循环 运行 service boost asio io 使用      更新时间:2023-10-16

我正在使用boost实现一些asio操作,我遇到了一个接口问题,我在初始化时没有收到"处理程序",但就在之后

这迫使我写一个"忙"循环,我想做的是即使没有至少一个处理程序也要运行io_service,这可能吗?处理这个问题的方法是什么?在服务上等待处理程序?这是我的密码。。

    /** : */
    void                Run             () { while(true) {m_srv.run(); Sleep(1);} } // once 1 handler is inside service, thread will not be in busy loop
private: // members:
    io_service  m_srv;

有什么建议吗?感谢

这就是代码问题:(m_drv是一个操作boost::thread(io_service::run..)的任务)

class App : public Base::Application
{
public:
    /** : */
    App(char* name, char* id) : Application(name, id), m_drv("NetTask"), m_worker("Worker"), m_acceptor(m_worker, Drv(), &OnAccept, 4567)
    {
        m_acceptor.Accept(Drv());
    }
    /** : */
    inline DriverImp& Drv() { return static_cast<DriverImp&>(m_drv.Imp());}
    /** : */
    inline Reactor& Worker() { return m_worker; }
public: 
    APTR(Socket) m_sock;
private: // members:
    Driver      m_drv;
    Reactor     m_worker;
    Acceptor    m_acceptor;
};

您需要使用io_service::work:

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

注意:在析构函数中,work对象通知service工作已完成,io_service::run()可能返回。