使用asio实现线程安全的协程

9
有没有办法在使用boost::asio的同时拥有线程安全的协程?
我想要一个io_service在多个线程上运行,并且让一些处理程序成为协程。 Boost.Coroutine似乎是一个解决方案,但他们文档中指出,他们不支持恢复在另一个线程中启动的协程。
据我所知,这个问题只有两种可能的解决方案:
1. 不使用协程。使用更加冗长(即使使用lambda表达式也是如此),但同样功能的回调链接方法来存储状态。 2. 强制每个处理程序仅在一个线程中运行。我知道这可以通过为每个线程设置单独的io_service来实现。顺便说一下,是否有一种简单的方法,类似于io_service::strand,可以强制一组处理程序在同一个线程中运行?
两者都不是好的解决方案。在一个解决方案中,我失去了协程。在另一个解决方案中,我失去了大部分的多线程能力。

1
你看过这两篇文章吗?http://blog.think-async.com/2009/08/secret-sauce-revealed.html 和 http://blog.think-async.com/2010/03/potted-guide-to-stackless-coroutines.html - Ralf
@Ralf 是的,我看到了那个,这也是我提出这个问题的原因。看起来是一个非常酷的想法,也是编写异步代码的更简单的方法。 - user406009
1个回答

3

看起来这个问题没有简单的解决方案。

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

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

也许我甚至可以使用宏来模拟协程风格,以解决这个问题。


顺便提一下,如果有一个协程库从回调函数内部运行协程的话,回调函数是协程的一个很好的驱动程序(https://code.google.com/p/libglim/source/browse/trunk/test_cbcoro.cc)。 - ArtemGr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接