C++ 在这个boost asio示例中,为什么io_服务在调用.async_accept之后启动

C++ 在这个boost asio示例中,为什么io_服务在调用.async_accept之后启动,c++,boost-asio,C++,Boost Asio,问题很简单(我的boost asio知识很差,所以可能很琐碎): 为什么io_服务是在我们已经执行了异步_接受的ctor之后启动的 因为这是编写此代码最方便的方法。只要异步操作在某个时刻得到处理,那么在完成之前启动异步操作是无害的。如果它们在服务启动之前完成,则它们将排队等待服务启动 如果您真的想将start\u accept函数分派给io\u服务,但这只会增加额外的复杂性和延迟,没有任何好处。因为这是编写此代码最方便的方法。只要异步操作在某个时刻得到处理,那么在完成之前启动异步操作是无害的。

问题很简单(我的boost asio知识很差,所以可能很琐碎):


为什么io_服务是在我们已经执行了异步_接受的ctor之后启动的

因为这是编写此代码最方便的方法。只要异步操作在某个时刻得到处理,那么在完成之前启动异步操作是无害的。如果它们在服务启动之前完成,则它们将排队等待服务启动


如果您真的想将
start\u accept
函数分派给
io\u服务
,但这只会增加额外的复杂性和延迟,没有任何好处。

因为这是编写此代码最方便的方法。只要异步操作在某个时刻得到处理,那么在完成之前启动异步操作是无害的。如果它们在服务启动之前完成,则它们将排队等待服务启动

如果您真的想将
start\u accept
函数分派给
io\u服务
,但这只会增加额外的复杂性和延迟,没有任何好处。

io\u服务::run()
功能块,直到所有工作完成且不再需要分派处理程序。如果
io\u service::run()
没有任何作用,它会立即返回。因此,在开始之前,您需要提供一些工作。就像在boost示例中一样:

{
    boost::asio::io_service io_service;
    tcp_server server(io_service);   // <-- prepares async task
    io_service.run(); // <-- blocks 
} // <-- all done 
io\u服务::run()
函数会一直阻塞,直到所有工作都完成并且没有更多的处理程序要调度。如果
io\u service::run()
没有任何作用,它会立即返回。因此,在开始之前,您需要提供一些工作。就像在boost示例中一样:

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

你能准确地说明你所说的启动和处理是什么意思吗?starting是async accept,handling是通过io_服务运行注册的处理程序?@nosenseal:是的,所谓“starting”是指用户调用类似
async_accept
的函数来启动异步操作。所谓“处理”,我指的是
io_服务
调用操作启动时提供的完成处理程序。顺便说一句,如果是另一种方式,将立即运行return?我知道这听起来很无聊,但是这个io_服务对我来说有点奇怪,因为我从过去开始(套接字、套接字、线程、套接字、线程)@nosenseal:Yes,
run
在没有工作要做时返回;因此,如果您在调用之前没有启动异步操作、发布一些工作或创建一个
work
对象,那么它将立即返回。@nosenseal:这里需要记住的重要一点是:如果您的io_服务曾经返回过,您需要调用它的
reset()
成员函数,然后才能运行
run()
,否则它总是会立即返回,什么也不做。您能否准确说明启动和处理的含义?starting是async accept,handling是通过io_服务运行注册的处理程序?@nosenseal:是的,所谓“starting”是指用户调用类似
async_accept
的函数来启动异步操作。所谓“处理”,我指的是
io_服务
调用操作启动时提供的完成处理程序。顺便说一句,如果是另一种方式,将立即运行return?我知道这听起来很无聊,但是这个io_服务对我来说有点奇怪,因为我从过去开始(套接字、套接字、线程、套接字、线程)@nosenseal:Yes,
run
在没有工作要做时返回;因此,如果您在调用之前没有启动异步操作、发布一些工作或创建一个
work
对象,那么它将立即返回。@nosenseal:这里需要记住的重要一点是:如果您的io_服务曾经返回过,您需要调用它的
reset()
成员函数,然后才能运行
run()
,否则它会立即返回,并且什么也不做。