非同期呼び出しと非ブロッキング呼び出し?ブロッキング呼び出しと同期呼び出しの違いも質問する

非同期呼び出しと非ブロッキング呼び出し?ブロッキング呼び出しと同期呼び出しの違いも質問する

非同期呼び出しと非ブロッキング呼び出しの違いは何ですか? また、ブロッキング呼び出しと同期呼び出しの違いは何ですか (例を添えてください)?

ベストアンサー1

多くの場合、これらは同じものの異なる名前ですが、状況によってはまったく異なります。したがって、状況によって異なります。用語は、ソフトウェア業界全体で完全に一貫した方法で適用されているわけではありません。

たとえば、従来のソケット API では、非ブロッキング ソケットは、特別な「ブロックされる」エラー メッセージとともにすぐに返されるソケットですが、ブロッキング ソケットはブロックされます。再試行する適切なタイミングを確認するには、selectやなどの別の関数を使用する必要があります。poll

しかし、非同期ソケット (Windows ソケットでサポートされているもの)、または .NET で使用される非同期 IO パターンの方が便利です。メソッドを呼び出して操作を開始すると、フレームワークはそれが完了するとコールバックします。ここでも基本的な違いがあります。非同期 Win32 ソケットは、ウィンドウ メッセージを渡すことによって結果を特定の GUI スレッドに「マーシャリング」しますが、.NET 非同期 IO はフリー スレッドです (コールバックがどのスレッドで呼び出されるかわかりません)。

したがって、それらは常に同じことを意味するわけではありません。ソケットの例を要約すると、次のようになります。

  • ブロッキングと同期は同じ意味です。API を呼び出すと、何らかの応答が得られるまでスレッドが停止し、それが返されます。
  • 非ブロッキングとは、回答をすぐに返すことができない場合、API はエラーを返してすぐに何も行わないことを意味します。したがって、API が呼び出される準備ができているかどうかを照会するための何らかの関連する方法が必要です(つまり、効率的な方法で待機をシミュレートし、タイトなループでの手動ポーリングを回避する)。
  • 非同期とは、API が常に「バックグラウンド」でリクエストの処理を開始してすぐに戻ることを意味します。そのため、結果を取得するには何らかの関連する方法が必要です。

おすすめ記事