【问题标题】:Can boost::asio::thread_pool be used instead of combining boost::asio::io_context with a boost::thread::thread_group?可以使用 boost::asio::thread_pool 来代替 boost::asio::io_context 与 boost::thread::thread_group 的组合吗?
【发布时间】:2019-02-21 22:35:26
【问题描述】:

我正在努力解决我的一些困惑。我偶然发现了boost::asio::thread_pool,我认为可以使用某种方式自动组合boost::asio::io_contextboost::thread::thread_group,就像经常建议的那样(herehere)。似乎这个asio 特定的池可用于post 任务,但另一方面,一些网络类型如resolver 需要传递一个对象io_context 作为构造函数参数thread_pool不是,也不是源自。

【问题讨论】:

    标签: c++ boost-asio


    【解决方案1】:

    假设您有一个名为 iocio_context 对象。

    您可以创建多个线程,并在每个线程中调用ioc.run()。这是一个在 epoll/select/kqueue 上阻塞的阻塞操作。请注意ioc 是可共享的,通过在多个线程中调用ioc.run(),它们隐含属于ioc 使用的线程池。我们称这个池为io_threadpool

    现在创建一个名为compute 的单独线程池,用于执行其他操作。这是可能的:

    • 您可以在来自两个池的线程中使用ioc(除了少数,例如restart(),它要求ioc 没有在活动中运行)。

    • 您可以从任何线程进行同步 I/O 调用。

    • 您可以从任何线程调用像 async_read( ..., handler) 这样的异步调用。但是,处理程序仅在io_threadpool 线程之一中调用。

    • 您可以在任一线程池中分派任务,但如果该任务不会执行任何 I/O,我希望在计算池中分派它会更有效,因为系统不会必须唤醒被阻止的 epoll()/kqueue()/select() 调用。

    【讨论】:

      【解决方案2】:

      您应该将您的io_context.run() 发布到thread_pool

      【讨论】:

      • 所以...答案是否定的?
      • 是的,答案是否定的。您可以了解有关概念模型的更多信息。
      猜你喜欢
      • 2020-06-17
      • 2019-10-16
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 2011-09-28
      • 2021-11-07
      • 1970-01-01
      相关资源
      最近更新 更多