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

时间:2018-09-18 00:21:07

标签: c++ boost-asio

我正在努力消除我的困惑。我偶然发现了boost::asio::thread_pool,并认为有人可以像通常建议的那样herehere自动组合boost::asio::io_contextboost::thread::thread_group。看来,此asio专用池可用于post的任务,但是另一方面,某些网络类型(如resolver)需要传递一个对象io_context作为thread_pool不是并且也不从其派生的构造函数参数。

2 个答案:

答案 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