ASIO::IO_CONTEXT和ASIO::THREAD_POOL有什么区别?

2022-04-09 00:00:00 c++ boost-asio asio
asio::thread_poolasio::io_context谁的run()函数是从多个线程调用的,有什么区别?我可以将调用io_context::run()的线程的boost::thread_group替换为asio::thread_pool吗?或者我需要一个io_context

更新

当我使用asio::thread_pool时,我是否仍然需要io_context来使用套接字、计时器等?thread_poolio_context都是asio::execution_context。然而,文档在io_context上说它"提供核心I/O功能"。如果我只使用asio::thread_pool而不使用io_context,我会丢失这些吗?


解决方案

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

io_service不假定将运行它的线程的任何内容:您需要确保这样做,并且您可以自由地决定是在多个线程上运行它,还是在一个线程上运行,甚至可以在混合线程上运行(就像一次运行一个线程,但从多个线程运行?)。

进一步说明:

  • 处理来自io_service运行/轮询成员(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],对比asio::io_service and thread_group lifecycle issue)
  • asio::thread_pool管理的线程是"不透明的":您无法控制它们是如何创建的。如果您需要按线程初始化第三方库,或者希望将Boost Thread与interruption_points等一起使用,这将是一件令人沮丧的事情。

相关文章