非対称コルーチンと対称コルーチンの違いは何ですか? 質問する

非対称コルーチンと対称コルーチンの違いは何ですか? 質問する

Boost.Coroutine2 for C++ で対称コルーチンのサポートが削除されたことに気づいたので、この 2 つの違いは何かを理解したいと思いました。

ベストアンサー1

対称コルーチンと非対称コルーチンの違いは、Ana Lúcia de MouraとRoberto Ierusalimschyの論文「コルーチンの再考「:」

コルーチンのよく知られた分類は、提供される制御転送操作に関するもので、対称的なそして非対称コルーチン。対称コルーチン機能は、コルーチン同士が明示的に制御を渡すことができる単一の制御転送操作を提供します。非対称コルーチン機構(一般的には半対称またはセミコルーチンは、コルーチンを呼び出すための操作と、コルーチンを一時停止するための操作の 2 つの制御転送操作を提供します。後者は、コルーチンの呼び出し元に制御を返します。対称コルーチンは同じ階層レベルで動作しますが、非対称コルーチンは呼び出し元に従属するものと見なすことができます。これらの関係は、呼び出されるルーチンと呼び出し元のルーチンの関係に多少似ています。

並行プログラミングをサポートするコルーチン機構は、通常、Modula-2のように、独立した実行単位を表す対称コルーチンを提供します。一方、値のシーケンスを生成する構造を実装することを目的としたコルーチン機構は、通常、非対称コルーチンを提供します。このタイプの構造の例は次のとおりです。イテレータそして発電機

(引用省略)

非対称コルーチン モデルでは、「非対称」とは、コルーチン間にスタックのような呼び出し元と呼び出し先の関係があることを意味します。コルーチンは、別のコルーチンを呼び出すことも、呼び出し元に制御を譲って自身を一時停止することもできます。通常は、同時に呼び出し元に値も渡します。

対称コルーチン モデルでは、コルーチンは制限なく他のコルーチンに制御を譲渡できます。

2つのモデルは実際には同じ表現力を持っています。つまり、非対称コルーチンは対称コルーチンを使用して実装でき、その逆も可能です。(対称コルーチン、Giovanni P. Deretta によって書かれた、2 種類のコルーチン間の変換について。) その結果、Moura と Ierusalimschy は次のように書いています。「両方の構造を提供すると、[コルーチン] メカニズムのセマンティクスが複雑になるだけで、表現力は向上しません。」

Coroutine2の開発者は、対称コルーチンの機能は次のように実装する方がよいと考え、ライブラリに対称コルーチンを提供しないことに決めました。boost::context::execution_context(Boost.Context の一部):http://lists.boost.org/Archives/boost/2015/06/223701.php

おすすめ記事