2011-12-19 59 views
8

有什么办法可以让线程安全协程和boost :: asio一起使用吗?线程安全协同程序与asio

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

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

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

  1. 不要使用协同程序。使用更详细的(即使与拉姆达),但同样功能的链接回调存储状态的方法。
  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

+0

@Ralf是的,我看到了,这就是为什么我问这个问题。看起来像一个非常酷的想法,并且是一种编写异步代码的更简单的方法。 – Lalaland

回答

3

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

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

它看起来像我将不得不最终使用一系列的回调,可能使用lambda的,如果我希望保持一切看起来语义上像一块代码块。也许我甚至可以用宏来解决某些问题,这些宏可以解析为lambda来模拟协程风格。

+0

仅供参考,如果有一个协程库从回调中运行协程的其余部分,则回调对于协程是非常好的驱动程序(https://code.google.com/p/libglim/source/browse/trunk/test_cbcoro .CC)。 – ArtemGr