我正在努力解决我的一些困惑。我偶然发现了 boost::asio::thread_pool 并且我认为可以使用以某种方式自动组合 boost::asio::io_context
和 boost::thread::thread_group
就像经常建议的那样( here或 here )。似乎这个 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/