如何使协程始终在同一线程中工作?
How do I make the coroutine always work in the same thread?
我想接受线程 0 中的连接,然后将此套接字发布到其他线程之一 (1 - 31) 进行负载平衡,我希望使用此套接字的所有其他操作都将在同一线程中,通过使用协程 -以避免线程间上下文切换g。
-
我想在不同的线程上执行异步回调,以便使用
io_service
+work
+vector<boost::thread>
进行负载平衡。 -
但与此同时,我想通过仅在同一线程中使用协程来使用此套接字执行所有其他操作 - 没有负载平衡和快速上下文切换。
如果我使用 boost.coroutine1 通过使用boost::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));
众所周知,协程之间的切换非常快,大约需要10-12 nsx86_64:http://www.boost.org/doc/libs/1_64_0/libs/coroutine/doc/html/coroutine/performance.html
但是,仅当协程切换发生在单个线程中时,才如此。因为线程切换需要100 多 ns。
那么如何使协程始终在同一线程中工作呢?
如果io_service绑定到许多线程,则无法使工作出现在同一个"物理线程"(因此,逻辑核心)上。
除此之外,您可以通过在链上生成 coro 来控制"逻辑线程"。
如果您必须具有线程亲和力,我认为没有比在单个线程上运行io_service更好的方法了,也许可以复制每个线程的io_service。
所有这些都可能会随着更通用的执行者提案而得到改进,我相信Chris Kohlhoff在他的github上有一个预览存储库。不妨看一看。
- C++为线程工作动态地分割例程
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- 餐饮哲学家问题 - 只有 2 个线程工作
- 工作线程在执行太快后永久休眠
- 唤醒多个线程以在每个条件下工作一次
- Qt::D irectConnection在多线程环境中使用时如何工作?
- ZeroMQ 在使用 std::thread 创建工作线程时崩溃
- 工作线程一直在等待,condition_variable甚至调用了notify_all
- 使用 std::atomic 标志和 std::condition_variable 在工作线程上等待
- SIGABRT 和线程相关的异常,但在调试期间工作正常
- c++线程的安全性和时间效率:为什么有互斥检查的线程有时比没有它的线程工作得更快
- 在多线程工作负载上解释Gperftools的结果
- 我的线程工作不好,它给出了所有结果,最后没有一个接一个,GUI 在线程运行期间挂起?
- BOOST::线程工作线程同步,C++和OpenCV
- 线程工作不正常
- 提升线程工作线程对象在线程完成后的重用
- 线程问题,其中一个线程工作,但导致调用方法不返回
- 线程工作目录
- MFC主UI线程工作和模态对话框
- 用类对象提升线程工作器