在这个提升asio示例中,为什么io_service在调用.async_accept之后启动

时间:2014-01-13 10:49:18

标签: c++ boost-asio

问题很简单(我的提升asio知识真的很糟糕,所以它可能是微不足道的):
http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/tutorial/tutdaytime3/src.html

为什么io_service在后启动我们已经执行了执行async_accept的ctor?

2 个答案:

答案 0 :(得分:3)

io_service::run()函数阻塞,直到所有工作完成,并且不再有调度程序。如果io_service::run()无所事事,则立即返回。所以你需要在开始之前提供一些工作。就像在例子中一样:

{
    boost::asio::io_service io_service;
    tcp_server server(io_service);   // <-- prepares async task
    io_service.run(); // <-- blocks 
} // <-- all done 

好的,我们尝试在run实例化之前调用tcp_server

{
    boost::asio::io_service io_service;
    io_service.run(); // <-- returns immediately
    tcp_server server(io_service);   // <-- prepares async task
} // <-- async task is cancelled (or its result is lost)

答案 1 :(得分:1)

因为这是编写此代码的最便捷方式。只要在某个时刻处理它们,在完成异步操作之前启动异步操作没有任何害处。如果它们在服务开始之前完成,那么它们将排队等候直到它。

构造函数可以start_accept函数调度到io_service,如果你真的想将它推迟到服务运行,但这只会增加额外的复杂性,并且延迟,没有任何好处。