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

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

本文关键字:asio 什么 区别 io context thread pool      更新时间:2023-10-16

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

更新

当我使用asio::thread_pool时,我还需要一个io_context来使用插座、计时器等吗?thread_poolio_context都是asio::execution_context。但是,文档在io_context上说它"提供核心I/O功能"。如果我只使用没有io_contextasio::thread_pool,我会丢失这些吗?

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

io_service不假设将运行它的线程的任何内容:您需要确保这样做,并且您可以自由决定是在多个线程、一个线程还是混合上运行它(例如一次一个线程,但来自多个线程?

进一步说明:

  • 处理来自io_service运行/轮询成员的异常(是否应该捕获 boost::asio::io_service::run(( 引发的异常?
  • 如果在多个线程上运行io_service,请确保您了解所用服务对象的线程安全性(请参阅为什么使用 boost::asio 时每个连接需要 strand ?
  • 如果您知道有多少线程将运行您的服务,请考虑在构造 (https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/overview/core/concurrency_hint.html( 上提供并发提示
  • io_service可以重新启动(reset()后(。asio::thread_pool不是那么多(参见[搜索已死ATM],与asio::io_service和thread_group生命周期问题进行比较(
  • asio::thread_pool管理的线程是"不透明的":您无法控制它们的创建方式。如果您需要例如初始化每个线程的第三方库或想要将 Boost Thread 与interruption_points 等一起使用,那就太糟糕了。