1. ホーム
  2. asynchronous

[解決済み] 非同期呼び出しとノンブロッキング呼び出し? ブロッキングと同期呼び出しの間にも

2022-03-23 19:40:44

質問

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

どのように解決するのですか?

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

例えば、古典的なソケットAPIでは、ノンブロッキングソケットは特別な "would block" エラーメッセージとともにすぐに戻るものですが、ブロッキングソケットはブロックされます。のような別の関数を使用する必要があります。 select または poll をクリックすると、再試行のタイミングがわかります。

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

そこで 同じ意味とは限りません。 . ソケットの例を抽出すると、次のようになります。

  • ブロッキングとシンクロナス は同じことを意味します。 何らかの回答があるまでスレッドをハングアップさせる そして、それをあなたに返します。
  • ノンブロッキング というのは、答えを迅速に返せない場合、APIの 即座に返す をエラーとし、それ以上何もしない。そこで API を呼び出す準備ができているかどうかを問い合わせるための、関連する方法があるはずです。 (つまり、効率的な方法で待機をシミュレートし、タイトなループでの手動ポーリングを避けるため)。
  • 非同期 とは、API は常に即座に返されます。 を開始しました。 背景の努力 そのため、結果を得るための何らかの関連した方法があるはずです。