Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost::asio::io_服务运行避免繁忙循环_C++_Boost_Network Programming_Boost Asio_Busy Loop - Fatal编程技术网

C++ 使用boost::asio::io_服务运行避免繁忙循环

C++ 使用boost::asio::io_服务运行避免繁忙循环,c++,boost,network-programming,boost-asio,busy-loop,C++,Boost,Network Programming,Boost Asio,Busy Loop,我正在使用boost执行一些asio操作, 我遇到了一个接口问题,我在初始化时没有接收到“处理程序”,但在初始化之后 这迫使我编写一个“忙”循环,我想做的是让io_服务运行,即使没有至少一个处理程序,是否可能?处理这个问题的方法是什么?在服务上执行等待处理程序吗? 这是我的密码 /** : */ void Run () { while(true) {m_srv.run(); Sleep(1);} } // once 1 han

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

这迫使我编写一个“忙”循环,我想做的是让io_服务运行,即使没有至少一个处理程序,是否可能?处理这个问题的方法是什么?在服务上执行等待处理程序吗? 这是我的密码

    /** : */
    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..)的任务)

类应用程序:公共基::应用程序
{
公众:
/** : */
应用程序(char*name,char*id):应用程序(name,id),m_drv(“NetTask”),m_worker(“worker”),m_接收者(m_worker,drv(),&OnAccept,4567)
{
m_acceptor.Accept(Drv());
}
/** : */
内联驱动RIMP&Drv(){返回静态强制转换(m_Drv.Imp());}
/** : */
内联反应器&Worker(){return m_Worker;}
公众:
APTR(插座)m_插座;
非官方成员:
司机m_drv;
反应堆机械工人;
接受者m_接受者;
};
您需要使用:


注意:在析构函数中,
工作
对象通知
服务
工作已完成并且
io_服务::运行()
可能会返回。

您的循环有一个小问题:的文档说明,如果
run
返回,您必须在再次调用
run
之前调用。我不想离开run:),处理程序应该在启动后存在。。但是,好的,我会查一下,还有什么方法可以避免繁忙的循环呢?自从我上次使用Boost ASIO以来,这是几年前的事了,我现在没有可用的源代码,但我记得我只是把
io\u服务.run()
调用放在自己的线程中,没有循环。我认为这是在进行任何异步调用之前完成的,而且它工作得很好。。他们说您必须在服务中至少有一个处理程序后调用run。此外,由于run将在它停止工作后退出,我不需要调用reset…?我不知道这有什么帮助,worker说它将在没有更多处理程序时结束,我不希望它永远停止finish@Alon,对不起,没听清楚。问题解决了吗?没有,工作进程仍然存在,因为它没有工作,所以我仍然必须这样做,而(true)这意味着您正在错误地使用io_service::work。向我们展示代码。我看不到您在代码中的任何地方使用
io\u service::work
。但这正是你需要的。只要
work
对象保持活动状态,对
io\u service.run()
的任何后续调用都不会返回。因此,您可以创建
io\u服务
,然后创建
工作(io\u服务)
,然后可以随时调用
io\u服务。运行()
,并确保在销毁
工作
对象(然后完成所有ahndler)之前,它不会返回。
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;
};
boost::asio::io_service        service;
boost::asio::io_service::work  work( service );