10

次の特性を持つ stdin/stdout を介したノンブロッキング IO の最適なソリューションを見つけようとしています。

  • 十分なデータがある限り、nサイズのチャンクで読み取ります。
  • 十分なデータがない場合は、部分的なチャンクで読み取ります。
  • 利用可能なデータがない場合は、データが得られるまでブロックします (たとえnよりも小さい場合でも)。

目標は、「制御」コードをすぐに処理しながら、大規模なデータセットを効率的に転送できるようにすることです (部分的に満たされたバッファーにコードを残すのではなく)。

スレッドと istream::get() ループを使用するか、プラットフォーム固有のコードをたくさん書くことでこれを達成できることを私は知っています (Windows ではファイル ハンドルで select() を実行できないため)... (( istream::readsome() も有望に思えますが、Googleで見つけた唯一の結果は、実際にはうまく機能しないと言っている人だけでした.))

私はこれらの API を使ったコーディングをあまり行っていないので、もっと良い方法があるかもしれません。

4

3 に答える 3

7

たぶん、boost::asioが役に立ちますか?

于 2008-11-24T19:14:08.837 に答える
2

スレッドとプラットフォーム固有のコードを使用しました。別の質問に対する私の回答を参照してください。OS 固有のものを inputAvailable() に入れることができました (Linux は select を使用し、Windows は単に true を返します)。次に、Windows でタイムアウトを指定して WaitForSingleObject() を使用してスレッドを完了させ、TerminateThread() を使用してスレッドを強制終了することができます。非常に醜いですが、チームはこのブーストを使いたくありませんでした。

于 2009-08-14T23:37:45.373 に答える
0

私は jwhitlock に似たようなことをしました...適切なOS固有の実装(*)をラップするStdinDataIOクラスになりました。これにより、プログラムの残りの部分は、StdinDataIOが提供するファイル記述子でselect()を実行できます。標準入力に関する Windows の制限。コードはすべてオープンソース/BSDライセンスです

(*) 実装は Linux/MacOSX の単純なパススルーであり、Windows では、標準入力から読み取り、ソケットを介して受信したデータをメイン スレッドに戻すように子スレッドを設定するかなり複雑なプロセスです。 . あまりエレガントではありませんが、機能します。

于 2009-08-14T23:46:39.007 に答える