2013-08-31 77 views
1

我有以下的(最小化)类处理我的服务器连接:如何防止Boost :: Asio计时器阻止io_service :: run()的返回?

class AsioServer { 
protected: 
    boost::asio::io_service ioService; 
public: 
    AsioServer() {} 

    void add_request() { 
     //Adding async requests to the ioService 
    } 

    void timeout() { 
     //Stop all pedning async operations 
     ioService.stop(); 
    } 

    void perform() { 
     //Set a timer 
     boost::asio::deadline_timer timer(ioService); 
     timer.expires_from_now(boost::posix_time::seconds(5)); 
     timer.async_wait(std::bind(&AsioServer::timeout, this)); 

     //Performe all Async operations 
     ioService.run(); 
     ioService.reset(); 
    } 
}; 

我的问题是,期限计时器防止ioService.run()返回,直到它过期。我想要的是定时器仅在完成时取消并取消异步操作时调用,但在io_service的上下文中不作为work。有没有计时器作为工作,或处理这种情况的另一种好方法?

+0

在单独的线程中运行? –

+0

@JoachimPileborg:可能,但我认为它会很难看,因为在实际的代码中,超时函数会做更多的事情。并调用'ioService.sop()'不会取消正在运行的处理程序,因此我将不得不使用大量的互斥体,我想避免。 – Haatschii

+0

'io_service'是调度定时器完成处理程序(以及其他asio对象处理程序)的工具 - 如果'io_service'在此之前退出,则没有人会调用您的'timeout'函数! –

回答

1

io_service::run不退出(如果没有明确停止),只要它有一些工作 - 这包括/任我完成处理O对象和定时器,因为io_service是调度所有这些处理程序负责。

如果您不希望计时器在套接字I/O操作完成后再等待 - 只需要cancel()计时器或重新计划它(如果适用)。你可以找到这样的方法in asio examples

相关问题