我正在努力消除我的一些困惑.我偶然发现了boost :: asio :: thread_pool,我认为可以使用以某种方式自动组合,boost::asio::io_context并且boost::thread::thread_group经常建议(这里或这里).似乎这个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线程中调用。
您可以在任一线程池中分派任务,但是如果任务不执行任何 I/O,我希望在计算池中分派它会更有效,因为系统不必唤醒epoll()/ kqueue()/select()被阻止的调用。
| 归档时间: |
|
| 查看次数: |
664 次 |
| 最近记录: |