与asio线程安全协同程序

问题描述 投票:8回答:1

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

我想要一个io_service在多个线程上运行,并让我的一些处理程序是协同程序。

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

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

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

两者都没有任何好的解决方案。在一个解决方案中,我失去了协同程序。在另一方面,我失去了大部分的多线程能力。

c++ boost-asio coroutine
1个回答
3
投票

似乎这个问题没有简单的解决方案。

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

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

也许我甚至可以使用解析为lambdas的宏来模拟协程样式。

© www.soinside.com 2019 - 2024. All rights reserved.