0

入力ファイル ストリームの同期を実装固有にする理由は何ですか。ストリームが外部デバイスからのコンテンツでバッファを (部分的または完全に) 満たすことは明らかだと思いませんか? 標準 C++ IOStreams と Locales で次のように述べています。

出力ファイルの同期は、 への呼び出しによって実行されるファイルにバッファの内容を書き込むことによって、内部バッファを空にすることとして定義されますoverflow()。入力ファイルの場合、同期の意味は標準では定義されていませんが、IOStreams ライブラリの実装に依存します。

実装を対称にして、入力ファイル ストリームのバッファに を呼び出させるだけで十分ではないでしょうunderflow()か? この決定の理由は何でしたか?

4

1 に答える 1

2

書き込みにはファイルを変更するという副作用があり、複数のライターが競合して同じファイルに書き込みを行うことは珍しくありません。ファイルの書き込みと読み取りを同時に行うことも一般的な使用例です。標準では基本的に、( buffered ではなく) syscallをoverflow()作成して同期をオペレーティング システムに委譲すると述べています。write()fwrite()

読み取りにはファイルに対する副作用はありません (時々更新される可能性があります)。複数のリーダーが互いに競合しないため、同期は必要ありません。

一方、パイプまたはソケットの読み取りには、基礎となるバッファーの内容を変更するという副作用があります。ただし、リーダーが競合して同じパイプ、TCP、またはストリーム UNIX ソケットから読み取ることはあまり意味がありません。データグラム ソケットには意味があるかもしれませんが、ストリームである IOStream がデータグラム ソケットで動作するように設計されているかどうかはわかりません。私は、標準のライターが読み取り同期の適切なユースケースを思いつくことができなかったため、未指定のままにしたと収集しています。

于 2013-10-25T22:31:47.107 に答える