1

スレッドを強制的に呼び出しから、ストリームからのブロッキング読み取りなどのブロッキング関数に戻すことは可能ですか?

int x;
std::cin >> x;

例えば...

4

4 に答える 4

5

いいえ、できません。読み取るデータがあるかどうかを確認する場合は、select()システムコールを使用します。待機中のデータがある場合にのみ読み取る場合は、ブロックすることはありません。

于 2010-01-15T17:08:30.947 に答える
0

たぶんそのistream::readsome()方法を試してみてください。デバイスを待たずに、バッファリングされたストリームのバッファにあるものを読み取るだけです。

于 2010-01-15T17:45:33.807 に答える
0

istreamオブジェクトをのぞくことができます。

別の方法は、コンソール入力を永続的に待機し、データをキューまたはバッファーに配置する別のスレッドを作成することです。バッファへのインターフェースはあなた次第です。あなたはそれをブロッキング、非ブロッキング、またはタイムアウト(または3つすべて)にすることができます。

于 2010-01-15T18:54:22.883 に答える
0

それは不可能だと言われているので、いくつかの選択肢を与えることは素晴らしいことだと思います。

私は通常、いくつかのサーバーコードを実行しますが、データベースへの同期呼び出し(ブロック)でも同じ問題が発生します。場合によっては(何らかの理由で)呼び出しが十分に速く戻らないことがあり、処理に限られた時間があります。

私たちが採用したソリューションは非常に単純で、もちろんMTが含まれます。

  • クエリを受信したら、完了時にコールバックを呼び出すタイマーを開始します
  • 正常に完了したら、タイマーを無効にします。今は必要ありません。
  • 処理を行い、「ブロックされた」呼び出しごとにタイマーを確認します(他の定期的な間隔でもよいでしょう)。起動された場合は、長すぎるため、処理を中止して急いで戻る必要があります。あなたが長すぎたので、別のスレッドがクエリに答える責任があります。
  • タイマーが起動すると、コールバックで新しいスレッドを開始します。このメソッドは「ベストエフォート」方式で応答することになっているため、ブロックされた呼び出しの使用を控える必要があります。当該BOMがMTを正しく処理する場合(ロックなど)、他のスレッドが使用するBOMを使用する場合があります。

習慣として、タイマーを、リクエストの処理に許可された最大時間の75%から95%の間の快適なゾーンに設定しました(リクエストのカテゴリによって構成されます)。

これにより、通話のブロックを適切に回避できます。BOMを適切に同期したくない場合(オーバーヘッドが伴うため)、「ベストエフォート」の答えは単純な再試行メッセージ(95%)である可能性があります。クリーンアップを行うか、別の方法(キャッシュ?)で回答する場合は、少なくともBOMの一部で同期が必要です(75%)。

于 2010-01-15T19:13:58.880 に答える