【发布时间】: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 :),处理程序应该在启动后存在.. 但是好的,我会查一下,还有什么方法可以避免繁忙循环?
-
自从我上次使用 Boost ASIO 已经是几年前了,我现在没有可用的源代码,但我记得我只是把
io_service.run()调用放在它自己的线程中,并且没有循环。我认为它是在进行任何异步调用之前完成的,而且它工作正常。 -
不是根据 boost 文档.. 他们说你必须在服务内至少有 1 个处理程序后调用 run
-
另外,由于运行结束后会退出,所以我不需要调用reset..?
标签: c++ boost network-programming boost-asio busy-loop