io_service/io_context 被设计为在工作耗尽时停止。
的文档io_service https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/reference/io_service.html#boost_asio.reference.io_service.stopping_the_io_context_from_running_out_of_work and io_context https://www.boost.org/doc/libs/1_73_0/doc/html/boost_asio/reference/io_context.html#boost_asio.reference.io_context.stopping_the_io_context_from_running_out_of_work包含:
阻止 io_context 耗尽工作
当没有更多工作要做时,某些应用程序可能需要阻止 io_context 对象的 run() 调用返回。例如,io_context 可能在应用程序的异步操作之前启动的后台线程中运行。 run() 调用可以通过创建 boost::asio::executor_work_guard<:executor_type> 类型的对象来保持运行:
boost::asio::io_context io_context;
boost::asio::executor_work_guard<boost::asio::io_context::executor_type>
= boost::asio::make_work_guard(io_context);
...
为了实现关闭,应用程序需要调用 io_context 对象的 stop() 成员函数。这将导致 io_context run() 调用尽快返回,放弃未完成的操作,并且不允许分派就绪处理程序。
或者,如果应用程序要求允许所有操作和处理程序正常完成,则可以显式重置工作对象。
boost::asio::io_context io_context;
boost::asio::executor_work_guard<boost::asio::io_context::executor_type>
= boost::asio::make_work_guard(io_context);
...
work.reset(); // Allow run() to exit.
请注意,“老式”Asio 界面使用了不太通用的接口io_service::work
object:
io_service ios;
io_service::work work(ios); // old interface!
这将需要您做额外的工作才能重置它:
asio::io_service ios;
std::optional<asio::io_service::work> work(ios);
// ...
work.reset();
正在重启
最后当上下文did没有工作了,你将不得不restart()
在重新使用它之前:
基本原理
我认为设计的理由来自于图书馆没有任何
关于服务如何在调度和线程方面运行的意见,
结合保证io_context
/io_service
必须是
线程安全²。看文档用于
背景 https://www.boost.org/doc/libs/1_73_0/doc/html/boost_asio/overview/core/threads.html.
1 旁注:同样,thread_pool
(这是-aexecution_context
就像io_context
is) 不是为重复使用而设计的(参见例如Boost asio thread_pool join不等待任务完成 https://stackoverflow.com/questions/61328430/boost-asio-thread-pool-join-does-not-wait-for-tasks-to-be-finished/62399256#62399256)
² 当然,对象生命周期(构造/销毁)除外