スレッドセーフなコルーチンとasio

boost :: asioと一緒にスレッドセーフコルーチンを使用できる方法はありますか?

1つの io_service を複数のスレッドで実行し、ハンドラの一部をコルーチンにしたいとします。

Boost.Coroutine would seem to be a solution, but they document that they do not support resuming a coroutine that was started in a separate thread.

私が知る限り、この問題の解決方法は2つしかありません。

  1. コルーチンを使用しないでください。はるかに冗長(ラムダの場合でも)を使用しますが、状態を格納するコールバックを連鎖させる等しく機能的な方法を使用してください。
  2. 各ハンドラを1つのスレッドでのみ実行するようにします。私はこれが各スレッドのために別々のio_serviceを持つだけで可能であることを知っています。さて、io_service :: strandと同様に、ハンドラのセットを同じスレッドで実行させるのは簡単な方法でしょうか?

どちらも良い解決策ではありません。 1つの解決策では、私はコルーチンを失う。もう一つは私のマルチスレッド能力の大部分を失います。

8
@ラルフええ、私はそれを見たので、私はこの質問をしています。非常にクールなアイデア、非同期コードを書くための簡単な方法のようです。
追加された 著者 Lalaland,

1 答え

この問題には簡単な解決策がないようです。

主な障害の問題はおそらく、C ++がコンパイラに関数の中で起こったことの大部分を並べ替えることができるという事実によると思われる。したがって、関数内で起こっていることの順序に確実に依存することはできません。

意味のあるものをコードブロックのように見せたいという希望があれば、ラムダを使用して一連のコールバックを使用しなければならないようです。

おそらく、私はコルーチンスタイルをシミュレートするためにラムダに解決するマクロを使って何かをハッキングすることさえできます。

3
追加された
参考までに、コルーチン内の残りのコルーチンを実行するコルーチンライブラリがある場合、コールバックはコルーチンの優れたドライバです( code.google.com/p/libglim/source/browse/trunk/test_cbcoro.c‌ c )。
追加された 著者 ArtemGr,