c++ - 可以使用 boost::asio::thread_pool 来代替 boost::asio::io_context 与 boost::thread::thread_group 的组合吗?

标签 c++ boost-asio

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

最佳答案

假设你有一个单独的 io_context 对象,名为 ioc

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

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

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

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

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

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

    <

关于c++ - 可以使用 boost::asio::thread_pool 来代替 boost::asio::io_context 与 boost::thread::thread_group 的组合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52377278/

相关文章:

c++ - 完成处理程序中的 Boost 绑定(bind)错误

c++ - 自定义 Web 服务中的 boost::asio::read() 阻塞

c++ - 在编译时验证对象是否创建为 shared_ptr

C++ 通过引用程序

c++ - 基于std::any的属性系统:模板类型推导

c++ - 如何在不输入 C++ 值的情况下跳过字段

c++ - boost::asio 计时器的线程安全工作

c++ - 同时读取 100 个 telnet 连接 c++

c++ - 具有多个参数的 Map.emplace C++ 17

C++ 无尽的 cin 控制台提示符