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

时间:2017-06-12 19:52:37

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

如果io_service绑定到许多线程,则无法使工作出现在相同的&#34;物理线程&#34; (所以,逻辑核心)。

除此之外,你可以控制&#34;逻辑线程&#34;通过在绳子上产生coro。

如果你必须具有线程亲和力,我认为没有比在单个线程上运行io_service更好的方法,可能会重复使用每个线程的io_service。

所有这些都可能会受到更广泛的Executors提案的改进,我相信Chris Kohlhoff在他的github上有预览回购。您可以查看一下。