在这个提升 asio 示例中,为什么在调用 .async_accept 后启动io_service
In this boost asio example why is the io_service started after .async_accept is called
问题很简单(我的提升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
,如果您真的想将其推迟到服务运行,但这只会增加额外的复杂性和延迟,没有任何好处。
相关文章:
- 使用用户定义的参数调用future/async并调用类方法
- std::async 如何工作:为什么它会调用这么多次复制/移动?
- std::async 不会立即调用
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- 为什么使用线程池时嵌套调用 boost::async 会阻塞?
- 使用 std::async 调用模板函数的正确方法是什么?
- C 中多个async调用
- 有没有一种方法可以从C++中调用"async"python方法
- 当Qt-Slot位于通过std::async创建的线程上时,它不会被调用
- 应该在游戏循环c++中调用std::async吗
- 如何使用“std::async”在互斥锁保护循环中调用函数
- 使用C++11期货:std::async崩溃的嵌套调用:编译器/标准库错误
- 可以 std::async 调用 std::function 对象
- 为什么调用 std::async 后的时间成本为 0 秒
- 在高频率下调用std::async可以吗
- 用std::async调用带unique_ptr类型的函数
- 为什么std::async即使指定了std::launch::async标志,也要同步调用函数?
- 使用std::async从线程调用函数
- 用线程池替换许多std::async调用
- 如果父/主线程死亡,std::async调用会发生什么?