可以使用boost :: asio :: thread_pool而不是将boost :: asio :: io_context与boost :: thread :: thread_group结合使用吗?

scr*_*nut 14 c++ boost-asio

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

Sri*_*san 5

假设您有一个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线程中调用。

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


use*_*407 2

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