20

C++14 の提案の 1 つは、現在 C# で async/await メカニズムを使用して利用できるものを C++ に提供する再開可能関数です。基本的な考え方は、非同期操作が完了するのを待っている間、関数を一時停止できるというものです。非同期操作が完了すると、関数は一時停止された場所から再開できます。これは、再開可能な関数が呼び出されたスレッドがブロックされないように、ノンブロッキングの方法で行われます。

関数がどのコンテキスト (スレッド) で再開されるかは、私には明らかではありません。関数が一時停止されたスレッドによって再開されますか (これは、私が理解しているように C# で行われる方法です)、それとも別のスレッドを使用しますか?

一時停止したスレッドによって再開された場合、スレッドを特別な状態にする必要がありますか、それともスケジューラがこれを処理しますか?

4

1 に答える 1

4

N3564 から引用するには:

中断後、再開可能な関数は、ランタイムのスケジューリング ロジックによって再開される可能性があり、最終的にそのロジックを完了します。その時点で、return ステートメント (明示的または暗黙的) を実行し、関数の結果値をプレースホルダーに設定します。

したがって、外部 (呼び出し元) と内部から観察される関数の動作には非対称性があることに注意してください。外部の観点では、関数は最初の一時停止ポイントで future 型の値を返すということですが、内部の観点では、 function は return ステートメントを介して型 T の値を返しますが、future/shared_future を返す関数はまだ多少異なる動作をします。

再開可能な関数は、実行の中断に続いて再開した後、別のスレッドで実行を継続できます。

これは本質的に次のことを意味します。

  • 再開可能な関数は、最初に呼び出されると、その呼び出し元のスレッド コンテキストで実行されます。
  • 各中断ポイントの後、実装は、再開可能な関数の実行を続行するスレッドを自由に選択できます。
  • 呼び出しコードの観点から見ると、再開可能な関数は非同期関数のように機能し、(観察可能な) 動作の一部は関数呼び出しが戻るまでに確実に実行されますが、最終結果はまだない可能性があります (返された関数は返されfuture<T>ません)。準備完了状態である必要があります)。
  • プログラマーは、再開可能な機能を再開するために面倒なことをする必要はありません。
于 2013-06-19T10:12:34.627 に答える