asio::io_context 和 asio::thread_pool 有什么区别?

What's the difference between asio::io_context and asio::thread_pool?

asio::thread_poolasio::io_contextrun() 函数从多个线程调用的区别是什么?我可以用 asio::thread_pool 替换我的 boost::thread_group 个调用 io_context::run() 的线程吗?或者我需要某个地方 io_context?

更新

当我使用 asio::thread_pool 时,我还需要 io_context 才能使用套接字、定时器等吗? thread_poolio_context 都是 asio::execution_context。但是,文档在 io_context 上说它 "Provides core I/O functionality"。如果我只使用 asio::thread_pool 而没有 io_context,我会丢失这些吗?

一个线程池隐含 运行 发布在其上的所有任务(直到它停止)。

io_service 不会对 运行 它的线程做任何假设:您需要确保这样做,并且您可以自由决定是否 运行 它在多个线程、一个线程,甚至是混合线程(就像一次一个线程,但来自多个线程?)。

补充说明:

  • 处理来自 io_service run/poll 成员 (Should the exception thrown by boost::asio::io_service::run() be caught?)
  • 的异常
  • 如果您 运行 一个 io_service 多线程,请确保您了解您使用的服务对象的线程安全性(参见 Why do I need strand per connection when using boost::asio?
  • 如果您知道有多少线程将 运行 您的服务,请考虑在构造时提供并发提示 (https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/overview/core/concurrency_hint.html)
  • io_service可以重新启动(在reset()之后)。 asio::thread_pool 没那么多(参见 [搜索是 dead atm], compare with
  • asio::thread_pool 管理的线程是 "opaque":您无法控制它们的创建方式。如果您需要例如为每个线程初始化第三方库,或者想使用 interruption_points
  • 的 Boost Thread