【问题标题】:How do I make the coroutine always work in the same thread?如何使协程始终在同一个线程中工作?
【发布时间】:2017-11-14 09:57:18
【问题描述】:

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

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

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

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

如果可以,那么如何使协程的回调始终在调用异步操作的同一线程中执行,即使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));

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

但这只有在协程的切换发生在单个线程中时才是正确的。因为线程切换需要超过 100 ns

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

【问题讨论】:

标签: c++ multithreading boost boost-asio boost-coroutine


【解决方案1】:

如果 io_service 绑定到多个线程,则无法让工作出现在同一个“物理线程”(即逻辑核心)上。

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

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

所有这些都可能通过更通用的 Executors 提案得到改进,我相信 Chris Kohlhoff 在他的 github 上有一个预览 repo。你不妨看看。

【讨论】:

猜你喜欢
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多