【问题标题】:Thread safe coroutines with asio使用 asio 的线程安全协程
【发布时间】:2012-01-23 07:57:30
【问题描述】:

有什么方法可以让线程安全的协程与 boost::asio 一起使用?

我希望io_service 在多个线程上运行,并让我的一些处理程序成为协程。

Boost.Coroutine 似乎是一个解决方案,但他们document 表示他们不支持恢复在单独线程中启动的协程。

据我所知,这个问题只有两种可能的解决方案:

  1. 不要使用协程。使用更冗长(甚至使用 lambda)但功能相同的方法来链接存储状态的回调。
  2. 强制每个处理程序仅在一个线程中运行。我知道这可以通过简单地为每个线程设置一个单独的 io_service 来实现。顺便说一句,有没有一种简单的方法,类似于 io_service::strand,可以强制一组处理程序在同一个线程中运行?

两者都不是好的解决方案。在一种解决方案中,我失去了协程。另一方面,我失去了大部分多线程能力。

【问题讨论】:

标签: c++ boost-asio coroutine


【解决方案1】:

看来这个问题没有简单的解决办法。

主要问题可能是由于 C++ 允许编译器重新排序函数中发生的大部分内容。因此,您不能可靠地依赖函数中发生的事情的顺序。

看起来我最终将不得不使用一系列回调,如果我希望让所有内容在语义上看起来像代码块,可能会使用 lambda。

也许我什至可以使用解析为 lambda 的宏来模拟协程风格。

【讨论】:

猜你喜欢
  • 2011-11-13
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多