1

fstream を使用する独自の IOsystem を作成しています。多くのスレッドがあり、私の質問は、どうすればそれを安全に保つことができるかということです。つまり、1 つのファイルから複数の読み取りを許可し、排他的に書き込みを続けることを意味します。たとえば、ファイルに書き込みたい 2 つのスレッドがある場合、最初のスレッドが fstream を閉じるまで 2 番目のスレッドを待機させます。複数のスレッドで単一のファイルにアクセスする場合、 TMultiReadExclusiveWriteSynchronizer を使用することが提案されましたが、それが最適なオプションかどうかはわかりません。私の考えの 1 つは、マップを保持し、ファイルを安全に開くことができる場合は、ファイルを開く前に手動でチェックすることです。そうでない場合は、ファイルが解放されるまでスレッドを待機させます。

編集: fstream を排他モードで開く方法はありますか? 多くのスレッド環境で fstream が最悪のオプションであると思われる場合、他にどのような可能性がありますか?

4

2 に答える 2

2

ミューテックスなどの同期プリミティブが役立ちます。たとえば、導入された C++11 標準ライブラリstd::mutexstd::lock_guard.

1つの可能性は、スレッドセーフなラッパーを書くことですoperator<<:

class FStreamWriter
{
    std::fstream *f;
    std::mutex mtx;
public:
    FStreamWriter(std::fstream *f) : f(f) {}

    template <typename T>
    FStreamWriter &operator<<(const T &x)
    {
        std::lock_guard<std::mutex> lock(mtx); // <- Mutex to make it safe-thread
        (*f) << x;
        return *this;
    }
   // ...
};

fstream file("my_file.txt");

// ...

FStreamWriter fwriter(&file);

次にfwriter、さまざまなスレッドでオブジェクトを使用します。

fwriter << "Hello" << 1 << 2 << 3;

C++11 を使用しない場合は、Boost、Qt、POSIX、Windows-API など、mutex を持つ多くの代替手段があります。しかし、主要な構造はそれらのすべてで同じです

于 2013-04-12T14:27:13.713 に答える
1

ミューテックスを使用する代わりに、低レベル IO ライブラリのロック メカニズムを使用する必要があります。したがって、実装しているストリーム クラスにファイル名を渡し、ファイル名を使用して独自の fstream オブジェクトを作成しますが、operator<< の実装ではロックを使用するため、これは常に機能し、必要なスレッドではありませんそれだけ。

コンストラクタ:

ファイルを開いてファイル記述子を取得し、記述子を fstream コンストラクターに渡します

演算子<<:

::flock(fileDescriptor, LOCK_EX); を使用します。fstream<< の前に、::flock(fileDecriptor, LOCK_UN); でロックを解除することを忘れないでください。

于 2014-03-03T12:17:40.457 に答える