スレッドを強制的に呼び出しから、ストリームからのブロッキング読み取りなどのブロッキング関数に戻すことは可能ですか?
int x;
std::cin >> x;
例えば...
スレッドを強制的に呼び出しから、ストリームからのブロッキング読み取りなどのブロッキング関数に戻すことは可能ですか?
int x;
std::cin >> x;
例えば...
いいえ、できません。読み取るデータがあるかどうかを確認する場合は、select()システムコールを使用します。待機中のデータがある場合にのみ読み取る場合は、ブロックすることはありません。
たぶんそのistream::readsome()方法を試してみてください。デバイスを待たずに、バッファリングされたストリームのバッファにあるものを読み取るだけです。
istreamオブジェクトをのぞくことができます。
別の方法は、コンソール入力を永続的に待機し、データをキューまたはバッファーに配置する別のスレッドを作成することです。バッファへのインターフェースはあなた次第です。あなたはそれをブロッキング、非ブロッキング、またはタイムアウト(または3つすべて)にすることができます。
それは不可能だと言われているので、いくつかの選択肢を与えることは素晴らしいことだと思います。
私は通常、いくつかのサーバーコードを実行しますが、データベースへの同期呼び出し(ブロック)でも同じ問題が発生します。場合によっては(何らかの理由で)呼び出しが十分に速く戻らないことがあり、処理に限られた時間があります。
私たちが採用したソリューションは非常に単純で、もちろんMTが含まれます。
習慣として、タイマーを、リクエストの処理に許可された最大時間の75%から95%の間の快適なゾーンに設定しました(リクエストのカテゴリによって構成されます)。
これにより、通話のブロックを適切に回避できます。BOMを適切に同期したくない場合(オーバーヘッドが伴うため)、「ベストエフォート」の答えは単純な再試行メッセージ(95%)である可能性があります。クリーンアップを行うか、別の方法(キャッシュ?)で回答する場合は、少なくともBOMの一部で同期が必要です(75%)。