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

In this boost asio example why is the io_service started after .async_accept is called

本文关键字:async 调用 accept service io 启动 为什么 asio      更新时间:2023-10-16

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

为什么io_service在我们已经执行了async_accept的 ctor 之后开始?

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)

因为这是编写此代码的最方便方法。在处理异步操作完成之前启动异步操作并没有什么坏处,只要在某个时候处理它们。如果它们在服务启动之前完成,则它们将排队,直到服务启动。

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