それらは並行して実行されるのではなく、順番に実行されます。実行中の Task の進行がブロックされると、その状態が保存され、制御が準備完了の Task に渡されます。これは協調的なマルチタスクであり、真の並列処理ではありません。
スレッドは、サンプルの原則に基づいて動作します。ただし、強調したい重要な違いがいくつかあります。
まず、async
/await
は OS スレッドではないという理由だけで:
- タスクは異なるスレッド ID を認識しません
- Task が生成されたときに、スレッド ローカル ストレージが自動的にコンテキスト スイッチされることはありません。
次に、動作の違い:
async
/await
協調マルチタスクを使用し、Win32 スレッドはプリエンプションを使用します。async
そのため、すべてのブロック操作は/await
モデルを使用して明示的に制御を生成する必要があります。そのため、生成するように記述されていない関数へのブロッキング呼び出しを行うことで、スレッド全体とそのすべてのタスクをブロックしてしまう可能性があります。
- マルチプロセッシング システムでは、タスクは並列に実行されません。再入可能性が制御されるため、データ構造の一貫性を維持することが非常に簡単になります。
Stephen がコメントで指摘しているように、マルチスレッド同期コンテキストを使用すると、(すべての複雑さと潜在的な競合状態と共に) 複数の OS スレッドで同時に実行できます。しかし、MSDN の引用は、シングル スレッド コンテキストのケースに関するものでした。
最後に、この同じ設計パラダイムが使用されている他の場所では、これらを研究することでasync
/の優れた実践について多くを学ぶことができます。await
- Win32ファイバー(スレッドと同じ呼び出しスタイルを使用しますが、協調的です)
- Win32重複する I/O操作、Linux aio
- コルーチン