提升asio服务返回的时间过早

时间:2018-11-22 01:34:04

标签: c++ asynchronous boost service asio

正试图解决有关io_service对象的问题。问题代码如下:

    void connect_handler(const error_code &ec,iterator iterator){
        cout<<"Connect handler"<<endl;
    }

    void resolver_handler(const error_code &ec,iterator iterator,boost::asio::io_service &io){
        cout<<"Resolver handler..."<<endl;
        boost::asio::ip::tcp::socket socket(io);
        boost::asio::async_connect(socket,iterator,&connect_handler);
    }

    int main(){
        boost::asio::io_service io;
        resolver resolver(io);
        resolver::query query("example.com","http");
        resolver.async_resolve(query,boost::bind(resolver_handler,boost::asio::placeholders::error,boost::asio::placeholders::iterator,boost::ref(io)));
        cout<<io.run()<<endl;

        return 0;
    }

在另一个简单示例中尝试了相同的事情,一切都按预期运行:

void printTwo(const error_code& ec,boost::asio::deadline_timer &timer,boost::asio::io_service &io){
    cout<<"print two"<<endl;
}

void printOne(const error_code& ec,boost::asio::deadline_timer &timer,boost::asio::io_service &io){
    cout<<"print one"<<endl;
    timer.async_wait(boost::bind(printTwo,boost::asio::placeholders::error,boost::ref(timer),boost::ref(io)));
}

int main(int argc, char** argv) {
    boost::asio::io_service io;
    boost::asio::deadline_timer timer(io,boost::posix_time::seconds(3));
    timer.async_wait(boost::bind(printOne,boost::asio::placeholders::error,boost::ref(timer),boost::ref(io)));
    cout<<io.run()<<endl;
    return 0;
}

我的假设是服务对象将阻塞,直到完成所有工作为止。调用run函数的线程也是调用处理函数的线程。那么,为什么第二个代码块按预期工作,而不是第一个代码块工作?预先感谢。

1 个答案:

答案 0 :(得分:0)

程序中的

@table(name = "Stores") public class Store extends SugarRecord<Store> { } 将在io.run()认为已完成其必须完成的工作后立即返回。这可能发生在之间操作之间,或者可能是在调用最后一个异步回调时(我不确定)。

使用work object通知io_service继续运行,当您重置该工作对象时,io_service的{​​{1}}调用应在执行完毕后返回任何待处理的操作。

基本用法如下:

io_service

通常在另一个线程或异步回调之一中,您可以这样做:

run()

稍后,boost::asio::io_service io_service; boost::asio::io_service::work work(io_service); // ... io_service.run(); // Blocks here 将返回。