2017-01-27 31 views

答えて

6

対称および非対称コルーチンの差を「Revisiting Coroutines」彼らの論文でアナルシアデモウラとロベルト・イエルサリムズチーによって特に良好に記述される:コルーチンの

よく知られている分類は、その制御トランスファオペレーションに関する対称の概念を区別するおよび非対称なコルーチンの概念を区別します。対称コルーチン機能は、コルーチンが明示的に制御を渡すことを可能にする単一の制御転送操作を提供します。非対称コルーチン機構(より一般的に半対称形またはsemiコルーチン)は、2つの制御転送オペレーションを提供します.1つはコルーチンを呼び出すためのものと、もう1つはコルーチンの呼び出し元に制御を戻すものです。対称コルーチンは同じ階層レベルで動作しますが、非対称コルーチンはその呼び出し側に従属すると見なすことができ、その関係は呼び出されたルーチンと呼び出し側ルーチンの間の関係と多少似ています。

並行プログラミングをサポートするコルーチンのメカニズムは、通常、Modula-2のように独立した実行単位を表す対称コルーチンを提供します。一方、一連の値を生成する構造を実装するためのコルーチン機構は、通常、非対称コルーチンを提供します。このタイプの構成の例は、イテレータおよびジェネレータです。

(引用省略)

非対称コルーチンモデルでは、「非対称」は、コルーチンの間にスタック状通話に関する関係があることを意味します。コルーチンは、別のコルーチンを呼び出すか、呼び出し元に制御を渡すことで自身を中断することができます。通常は同時に呼び出し元に値を返します。

対称コルーチンモデルでは、コルーチンは、他のコルーチンに対して制限なしで制御を与えることができます。

実際には2つのモデルの表現力は同じです。すなわち、対称コルーチンを用いて非対称コルーチンを実施することができ、逆もまた同様である。その結果、MouraとIerusalimschyは次のように書いています。「両方の構造を提供することは、表現力の向上なしに[コルーチン(coroutine)]メカニズムの意味を複雑にするだけです。パワー。"それらは対称コルーチン機能が良好boost::context::execution_context(Boost.Contextの一部)によって実装されていることを信じているのでCoroutine2の

開発者は、ライブラリ内の対称的なコルーチンを提供しないことに決めた。http://lists.boost.org/Archives/boost/2015/06/223701.php

4

コルーチンは、例えば、発呼者と被呼者との間で切り替えますcorotuine-functionを入力すると、呼び出し元のコードに戻ります。あなたのでコルーチン内

  • から呼び出され、サスペンド機能の呼び出し元
  • によって呼び出され、レジューム機能:通常(非対称)コルーチンは、この目的のための2つの機能を持っていますコンテキストを切り替える2つの機能を持って、それは非対称と呼ばれます。 対称コルーチンには、現在のコンテキストを中断して別のコンテキストを再開する関数が1つしかありません。次に対称コルーチンを再開する必要があることを指定する必要があります。

    対称コルーチンは、ユーザランドスレッドを実装するために使用することができる(対称コルーチンは、ユーザランドスレッドを表し、スケジューラは、次のユーザランドスレッドがスケジュールされている、例えば次symmtricコルーチン1つからジャンプ)より効率より非対称コルーチン。 対称コルーチンは、次のユーザランドスレッドを再開するために呼び出し側に戻る必要がないため、明らかです。 非対称コルーチンは、同じ機能を実現するために、対称コルーチンよりも多くのコンテキストスイッチを必要とします()。

    対称コルーチン - symmtricコンテキストスイッチは - より良い「現在の継続とコール」(スキーム、ルビー...)のような概念で表現されます。 boost.contextは、callcc()/ continuationの実装でこの概念をサポートしています。 したがって、boost.coroutine2は対称コルーチンAPIを提供しませんが、boost.coroutine2の非対称コルーチンはboost.contextのcallcc()/ continuationで実装されています。

+0

どういうわけか、私はこの回答がコルーチンに関する多くの知識や文脈を持っていない人には良い説明だと感じています。 – stucash