我正在努力消除我的困惑。我偶然发现了boost::asio::thread_pool,并认为有人可以像通常建议的那样here或here自动组合boost::asio::io_context
和boost::thread::thread_group
。看来,此asio
专用池可用于post
的任务,但是另一方面,某些网络类型(如resolver
)需要传递一个对象io_context
作为thread_pool
不是并且也不从其派生的构造函数参数。
答案 0 :(得分:2)
假设您有一个io_context对象,即ioc。
您可以创建多个线程,并在每个线程中调用ioc.run()。这是对epoll / select / kqueue进行阻止的阻止操作。请注意,ioc是可共享的,并且通过在多个线程中调用ioc.run,它们隐式地属于要由ioc使用的线程池。我们将此池称为“ IO线程池”。
现在创建一个单独的线程池,称为“计算”,以执行其他操作。这是可能的:
您可以在两个池中的线程中使用ioc(除了少数几个,例如restart(),这要求ioc不能主动运行)。
您可以从任何线程进行同步I / O调用。
您可以从任何线程调用异步调用,例如async_read(...,handler)。但是,该处理程序只能在io线程池线程之一中调用。
您可以在任何一个线程池中分派任务,但是如果任务不执行任何I / O,我希望它在计算池中分派任务会更高效,因为系统不必唤醒上被阻止的epoll / kqueue / select呼叫。
答案 1 :(得分:1)
您应该将io_context.run()发布到thread_pool