1

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

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

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

如果我通过 using 使用 boost.coroutine1boost::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));

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

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

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

4

1 回答 1

2

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

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

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

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

于 2017-06-13T07:03:08.607 回答