我想接受线程 0 中的连接,然后将此套接字发送到其他线程之一 (1 - 31) 用于负载平衡,然后我希望使用此套接字的所有其他操作都将在同一个线程中,通过使用协程 - 避免线程间上下文切换g。
我想通过使用
io_service
在不同线程上执行异步回调以实现负载平衡+work
+vector<boost::thread>
.但与此同时,我想通过仅在同一线程内使用协程来使用此套接字执行所有其他操作 - 无需负载平衡和快速上下文切换。
如果我使用 boost::asio::spawn()
来使用 boost.coroutine1那么协程是否可以在不同的线程上交替执行呢?
如果可以,那么我如何使协程的回调始终在调用异步操作的同一个线程中执行,即使到 io_service
是否绑定(bind)了很多线程(线程池)?
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 绑定(bind)了很多线程,就没有办法让工作出现在同一个“物理线程”(所以,逻辑核心)上。
除此之外,您可以通过在链上生成 coro 来控制“逻辑线程”。
如果您必须具有线程亲和性,我认为没有比在单个线程上运行 io_service 更好的方法了,或许可以为每个线程复制 io_service。
所有这些都可能会随着更通用的 Executors 提案而得到改进,我相信 Chris Kohlhoff 在他的 github 上有一个预览 repo。你不妨看看。
关于c++ - 如何让协程始终在同一个线程中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44507653/