15

私はMacOSXを使用しています。

アプリケーションのロガー部分で、データをファイルにダンプしています。

グローバルに宣言されたstd::ofstream outFile("log");

私のロギングコードには次のものがあります。

outFile << "......." ;
outFile.flush();

ここで、flush() が発生した後にコードがクラッシュしたとします。outFileディスクへの書き込みが保証される前に書き込まれたものですflush()( a を呼び出さないことに注意してくださいclose())。

ありがとう!

4

4 に答える 4

13

C++ ランタイムの観点からは、ディスクに書き込まれているはずです。OS の観点からは、まだバッファに残っている可能性がありますが、それが問題になるのは、マシン全体がクラッシュした場合のみです。

于 2010-02-26T11:28:38.387 に答える
7

別のアプローチとして、バッファリングを完全に無効にすることができます

outFile.rdbuf()->pubsetbuf(0, 0);

バッファリングされていないものへの書き込みはfstreamパフォーマンスを損なう可能性がありますが、測定する前にそれについて心配することは時期尚早の最適化になります.

于 2010-02-26T13:08:58.963 に答える
2

flush()が戻っている限り、プログラムは出力をOSの手に正常に渡します。OS(またはディスク)がクラッシュしない限り、次にディスクに書き込むときにデータがディスク上にあるはずです(ディスクには独自のソリッドステートキャッシュがある可能性が高いことに注意してください)。

flush()が戻るまで、ディスクにどれだけ到達するかは誰にもわかりません。

于 2010-02-26T11:50:17.687 に答える
2

flush() は iostream ライブラリのバッファをフラッシュします - ただし、データがオペレーティング システムのバッファからまったく同時にフラッシュされることはほとんどないため、オペレーティング システムのクラッシュによってデータが失われる可能性があるわずかな期間があります。もちろん、データが書き込まれたかどうかに関係なく、ハードディスクに障害が発生した場合はいつでもデータを失う可能性があるため、これについてはあまり心配する必要はありません。

于 2010-02-26T11:30:37.400 に答える