2017-01-31 12 views
1

私にはstd::istreamがあります。何とかそれを複数の読者に渡して、潜在的に異なるポジションを探したり読んだりすることは可能でしょうか?複数の読者にistreamをファンアウトすることは可能ですか?

そうでない場合、std::ifstreamの場合にはどうすればよいですか?

+0

ストリームはコピーできません。同じストリームオブジェクトを渡すアイディアは実現できません。 – Steephen

+0

range-v3にこのような機能が付いているかどうかは分かりませんが、 'InputRange'のような素晴らしい範囲関数を書くのはあまりにも悪くないと思います。遅延入力をループして出力コピーの範囲([1,2,3] - > [[1,2,3]、[1,2,3]、[1,2,3] ]))であり、その数はパラメータによって決定される。残念なことに、このような簡単な解決策は潜在的にシークにはあまり適していません。 – chris

+1

同じ 'std :: istream'の複数の場所から検索すると、他のシークを上書きします。そのファイルの場合、同じファイルに対して複数の 'std :: ifstream'を開いて、別の場所を探すことができます。 OSはあなたのためにアクセスを最適化するかもしれません。 – vu1p3n0x

答えて

-1

あなたはすでにあなたの質問に答えています。それがファイルストリーム(ifstream)であれば、ランダムアクセス(読み取り専用、オープンモードを設定することができます)、マルチスレッドifstreamを1つのスレッドに対して開くことによって、同じファイルにアクセスする複数のスレッドに問題はありません。 C++標準では、ifstreamに関するスレッドセーフでは何も言及していませんでした。ジェネリックistream(socket、cin)では、get()メソッドを使用すると入力ストリームを消費します。私はistreamのスレッドセーフなドキュメントは見当たりません。 peek()メソッドは入力ストリームを消費しませんが、引き続きistreamの内部状態を変更します。同じistreamに対してseek()を実行する複数のスレッドがある場合、動作は未定義です。あなたはC++言語による内部ロックを保証されていません。 seek()は基本的に内部バッファへの何らかのポインタの逆参照です。

istreamをいくつかのバッファ(構築されたオブジェクト(プロデューサ)または単純なRAWメモリ)に読み込むスレッドがあると、複数のスレッドが結果(コンシューマ)を消費する可能性があります。これは一般的なコンシューマ/プロデューサの同期です。任意のマルチスレッドテキストブックは、それを行う方法を教えてくれます。

+0

異なるスレッドは、ストリームの種類に関係なく、シーク時に互いに干渉します。 'fstream'も例外ではありません。 – MSalters

+0

次に、ソリューションは、単一スレッド読み取り、マルチスレッド消費、通常のコンシューマー/プロデューサモデルであり、istreamをラップする必要があります。 –

関連する問題