【发布时间】: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 ns:http://www.boost.org/doc/libs/1_64_0/libs/coroutine/doc/html/coroutine/performance.html
但这只有在协程的切换发生在单个线程中时才是正确的。因为线程切换需要超过 100 ns。
那么如何让协程始终在同一个线程中工作呢?
【问题讨论】:
-
上次我试图让它工作时,协程在多线程中惨遭失败。我会看看新的纤维库:boost.org/doc/libs/1_64_0/libs/fiber/doc/html/fiber/…
标签: c++ multithreading boost boost-asio boost-coroutine