【问题标题】:Avoiding busy loop with boost::asio::io_service run使用 boost::asio::io_service run 避免繁忙循环
【发布时间】:2013-12-05 16:12:51
【问题描述】:

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

这迫使我编写一个“忙碌”循环,我想做的是让 io_service 即使没有至少 1 个处理程序也能运行,这可能吗?有什么办法来处理这个?等待服务上的处理程序? 这是我的代码..

    /** : */
    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;
};

【问题讨论】:

  • 你的循环有点小问题:run 的文档指出,如果run 返回,你必须在再次调用run 之前调用reset
  • 我不想离开 run :),处理程序应该在启动后存在.. 但是好的,我会查一下,还有什么方法可以避免繁忙循环?
  • 自从我上次使用 Boost ASIO 已经是几年前了,我现在没有可用的源代码,但我记得我只是把 io_service.run() 调用放在它自己的线程中,并且没有循环。我认为它是在进行任何异步调用之前完成的,而且它工作正常。
  • 不是根据 boost 文档.. 他们说你必须在服务内至少有 1 个处理程序后调用 run
  • 另外,由于运行结束后会退出,所以我不需要调用reset..?

标签: c++ boost network-programming boost-asio busy-loop


【解决方案1】:

你需要使用io_service::work:

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

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

【讨论】:

  • 我看不出它有什么帮助,工人说当没有更多的处理程序时它会完成,我不希望它完成
  • @Alon,抱歉,没找到你。问题解决了吗?
  • 不,工人仍然退出,因为它没有工作,所以我仍然需要做 while(true)
  • 这意味着您使用 io_service::work 不正确。向我们展示代码。
  • 我没有看到您在代码中的任何地方使用io_service::work。但这正是您所需要的。只要work 对象仍然存在,任何对io_service.run() 的后续调用都不会返回。所以你创建io_service,然后创建work(io_service),然后你可以随时调用io_service.run(),并确保它不会返回,直到你销毁work对象(然后完成所有ahndlers)。
猜你喜欢
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多