问题很简单(我的提升asio知识真的很糟糕,所以它可能是微不足道的):
http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/tutorial/tutdaytime3/src.html
为什么io_service在后启动我们已经执行了执行async_accept的ctor?
答案 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
,如果你真的想将它推迟到服务运行,但这只会增加额外的复杂性,并且延迟,没有任何好处。