如何使协程始终在同一线程中工作?

How do I make the coroutine always work in the same thread?

本文关键字:线程 工作 一线 何使协 程始终      更新时间:2023-10-16

我想接受线程 0 中的连接,然后将此套接字发布到其他线程之一 (1 - 31) 进行负载平衡,我希望使用此套接字的所有其他操作都将在同一线程中,通过使用协程 -以避免线程间上下文切换g。

  • 我想在不同的线程上执行异步回调,以便使用io_service+work+vector<boost::thread>进行负载平衡。

  • 但与此同时,我想通过仅在同一线程中使用协程来使用此套接字执行所有其他操作 - 没有负载平衡和快速上下文切换。

如果我使用 boost.coroutine1 通过使用boost::asio::spawn()那么可以在不同的线程上交替执行协程吗?

如果可以,那么我如何使协程的回调始终在调用异步操作的同一线程中执行,即使io_service绑定了许多线程(线程池)?

for (size_t i = 0; i < thread_num_executors; ++i)
thr_grp_executors.emplace_back(
boost::bind(&boost::asio::io_service::run, &io_service));

众所周知,协程之间的切换非常快,大约需要10-12 nsx86_64:http://www.boost.org/doc/libs/1_64_0/libs/coroutine/doc/html/coroutine/performance.html

但是,仅当协程切换发生在单个线程中时,才如此。因为线程切换需要100 多 ns

那么如何使协程始终在同一线程中工作呢?

如果io_service绑定到许多线程,则无法使工作出现在同一个"物理线程"(因此,逻辑核心)上。

除此之外,您可以通过在链上生成 coro 来控制"逻辑线程"。

如果您必须具有线程亲和力,我认为没有比在单个线程上运行io_service更好的方法了,也许可以复制每个线程的io_service。

所有这些都可能会随着更通用的执行者提案而得到改进,我相信Chris Kohlhoff在他的github上有一个预览存储库。不妨看一看。