26

よくわかりません。Task1つまたは複数のスレッドを1つのスレッドで並行して実行するにはどうすればよいですか?並列処理についての私の理解は明らかに間違っています。

MSDNのビット私は頭を包むことができません:

asyncおよびawaitキーワードによって、追加のスレッドが作成されることはありません。非同期メソッドは独自のスレッドで実行されないため、非同期メソッドはマルチスレッドを必要としません。メソッドは現在の同期コンテキストで実行され、メソッドがアクティブな場合にのみスレッドで時間を使用します。

.. と:

タスクを開始してから待機するまでの間に、他のタスクを開始できます。追加のタスクは暗黙的に並行して実行されますが、追加のスレッドは作成されません。

4

1 に答える 1

25

それらは並行して実行されるのではなく、順番に実行されます。実行中の Task の進行がブロックされると、その状態が保存され、制御が準備完了の Task に渡されます。これは協調的なマルチタスクであり、真の並列処理ではありません。

スレッドは、サンプルの原則に基づいて動作します。ただし、強調したい重要な違いがいくつかあります。

まず、async/awaitは OS スレッドではないという理由だけで:

  • タスクは異なるスレッド ID を認識しません
  • Task が生成されたときに、スレッド ローカル ストレージが自動的にコンテキスト スイッチされることはありません。

次に、動作の違い:

  • async/await協調マルチタスクを使用し、Win32 スレッドはプリエンプションを使用します。asyncそのため、すべてのブロック操作は/awaitモデルを使用して明示的に制御を生成する必要があります。そのため、生成するように記述されていない関数へのブロッキング呼び出しを行うことで、スレッド全体とそのすべてのタスクをブロックしてしまう可能性があります。
  • マルチプロセッシング システムでは、タスクは並列に実行されません。再入可能性が制御されるため、データ構造の一貫性を維持することが非常に簡単になります。

Stephen がコメントで指摘しているように、マルチスレッド同期コンテキストを使用すると、(すべての複雑さと潜在的な競合状態と共に) 複数の OS スレッドで同時に実行できます。しかし、MSDN の引用は、シングル スレッド コンテキストのケースに関するものでした。

最後に、この同じ設計パラダイムが使用されている他の場所では、これらを研究することでasync/の優れた実践について多くを学ぶことができます。await

  • Win32ファイバー(スレッドと同じ呼び出しスタイルを使用しますが、協調的です)
  • Win32重複する I/O操作、Linux aio
  • コルーチン
于 2012-12-21T16:32:57.897 に答える