1

基本的に、次のワークフローがあります(コンソールアプリケーションを介して):

  • バイナリファイルの読み取り ( std::ifstream::read)
  • データ読み取りで何かをする
  • 同じファイル ( ) に書き戻し、std::ofstream::write前にあったものを上書きします。

さて、このコンソール プログラム全体をシェル スクリプトで (常に同じファイルを使用して) 1000 回実行した場合、読み取り操作が以前に実行されたファイルへの書き込みを試みるプログラムと競合しないと仮定しても安全ですか? または、実行間で待機する必要がありますか (どれくらい???)? ファイルの準備ができているかどうかを確実に判断できますか?

私はそれが最良の設計ではないことを知っています。それが確実に機能するかどうかを知りたいだけです(いくつかの統計をすばやく収集しようとしています-入力は異なりますが、出力ファイルは常に同じです-読み取る必要があり、情報を処理する必要があります。更新する必要があります (この時点では単純に上書きしています))。

編集:

出力が間違っているという問題は、回答に基づいてOSに関連していないようです。私が行う読み取り/書き込みは次のようになります。

//read
    std::ifstream input(fname,std::ios_base::binary);
    while(input)
    {
        unsigned value;
        input.read(reinterpret_cast<char*>(&value),sizeof(unsigned));
        ....
    }
    input.close();
...

//write
    std::ofstream output(fname,std::ios_base::binary);
    for(std::map<unsigned,unsigned>::const_iterator iter =originalMap.begin();iter != originalMap.end();++iter)
    {
        unsigned temp = iter->first;
        output.write(reinterpret_cast<char*>(&temp),sizeof(unsigned));
        temp = iter->second;
        output.write(reinterpret_cast<char*>(&temp),sizeof(unsigned));
    }
4

2 に答える 2

0

ctorのパラメータを確認してくださいfstream。一部の実装には拡張機能があり、共有モードを簡単に設定できます。

排他的な読み取りまたは書き込みを要求すると、ストリームを開いたままにしておく限り、それが得られます。他の同様の操作は、異なるプロセスから、または異なるストリーム インスタンスで同じように行うことはできません。

純粋な標準では、より多くのホップが必要です。おそらく、それらを filebuf に設定して、ストックのものを置き換えます。それを見てください。

共有モードの使用は、ファイルの一貫性を守るための主流の方法であるため、いずれにしても使用することをお勧めします。

確かに、競合状態が処理されていることを確認すると、あるプロセスがファイルを閉じる前に別のプロセスがファイルを開くことはありません。その結果も良好です。

于 2013-06-21T15:18:07.243 に答える