c++ - asio::io_context 和 asio::thread_pool 有什么区别?

标签 c++ boost-asio asio

asio::thread_pool 有什么区别和一个 asio::io_context谁的run()函数是从多个线程调用的?我可以更换我的 boost::thread_group调用 io_context::run() 的线程数与 asio::thread_pool ?或者我需要一个 io_context ?

更新

当我使用 asio::thread_pool ,我还需要io_context吗?使用套接字、定时器等?两者 thread_poolio_contextasio::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 管理的线程是“不透明的”:您无法控制它们的创建方式。如果您需要,那真是太可惜了为每个线程初始化一个第三方库,或者想通过 interruption_point s 使用 Boost Thread等
  • 关于c++ - asio::io_context 和 asio::thread_pool 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61864490/

    相关文章:

    c++ - 为什么 ASIO 套接字 open() 会失败?

    c++ - 直接从 RAM 发送原始数据

    c++ - BGL : specialization of template in different namespace

    c++ - 检测纯 C++ 中的精度损失

    c++ - 无法将简单的读/写串行端口代码从 boost::asio::serial_port 迁移到 QSerialPort

    c++ - Web服务器中proactor模式和同步模型的区别

    c++ - 使用 PortAudio 回调和 ASIO sdk 的输入延迟

    c++ - 如何处理 map 的 map ?

    c++ - 可以优化 C++ 类中引用的存储吗?

    c++ - boost asio transfer_exactly 读取 0 字节