C++ 可以使用boost::asio::thread_池而不是将boost::asio::io_上下文与boost::thread::thread_组组合使用吗?
我正试图澄清我的一些困惑。我无意中发现,我认为可以使用某种方式自动组合C++ 可以使用boost::asio::thread_池而不是将boost::asio::io_上下文与boost::thread::thread_组组合使用吗?,c++,boost-asio,C++,Boost Asio,我正试图澄清我的一些困惑。我无意中发现,我认为可以使用某种方式自动组合boost::asio::io_上下文和boost::thread::thread_组like常常被建议(或)。看起来,这个特定于asio的池可以用于将任务发布到,但另一方面,一些网络类型,如resolver需要将对象io\u context作为构造函数参数传递给thread\u pool不是,也不是从中派生出来的。您应该将io\u context.run()发布到thread\u pool假设您有一个io\u context
boost::asio::io_上下文
和boost::thread::thread_组
like常常被建议(或)。看起来,这个特定于asio的池可以用于将任务发布到,但另一方面,一些网络类型,如resolver
需要将对象io\u context
作为构造函数参数传递给thread\u pool
不是,也不是从中派生出来的。您应该将io\u context.run()
发布到thread\u pool
假设您有一个io\u context
对象,命名为ioc
您可以创建多个线程,并在每个线程中调用ioc.run()
。这是一个阻塞epoll/select/kqueue的阻塞操作。请注意,ioc
是可共享的,通过在多个线程中调用ioc.run()
,它们隐式地属于将由ioc
使用的线程池。我们将此池称为io\u threadpool
现在创建一个单独的线程池,名为compute
,用于执行其他任务。以下是可能的情况:
- 您可以在两个池中的线程中使用
(少数情况除外,如ioc
,这要求restart()
未处于活动运行状态)ioc
- 您可以从任何线程进行同步I/O调用
- 您可以从任何线程调用异步调用,如
。但是,该处理程序仅在一个async\u read(…,handler)
线程中调用io_线程池
- 您可以在任一线程池中分派任务,但如果任务不执行任何I/O,我希望在计算池中分派任务会更有效,因为系统不必唤醒被阻止的
/epoll()
/kqueue()
调用select()