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

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

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

如果我通过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 ns: http://www.boost.org/doc/libs/1_64_0/libs/coroutine/doc/html/coroutine/performance.html

但这只有在协程切换发生在单个线程内时才成立。因为线程切换花费了 超过 100 ns

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

如果io_service绑定了很多线程,就没有办法让作品出现在同一个"physical thread"上(所以,逻辑核心)。

除此之外,您可以通过在一条链上生成 coro 来控制 "logical threads"。

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

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