C++ 安全使用具有多线程的fstream有哪些选项

C++ 安全使用具有多线程的fstream有哪些选项,c++,multithreading,fstream,C++,Multithreading,Fstream,我正在创建自己的IOsystem,它使用fstream。将会有许多线程,我的问题是如何保证它的安全,这意味着允许从一个文件中多次读取,但保持独占写入。例如,如果有两个线程想要写入文件,我希望第二个线程等待第一个线程关闭其fstream。 在这里 有人建议使用TMultiReadExclusiveWriteSynchronizer,但不确定这是否是最佳选择。 我的一个想法是,如果文件可以安全打开,就保留地图并在打开任何文件之前手动检查,如果不能,就让线程等待文件发布 编辑: 有没有办法以独占模式打

我正在创建自己的IOsystem,它使用fstream。将会有许多线程,我的问题是如何保证它的安全,这意味着允许从一个文件中多次读取,但保持独占写入。例如,如果有两个线程想要写入文件,我希望第二个线程等待第一个线程关闭其fstream。 在这里 有人建议使用TMultiReadExclusiveWriteSynchronizer,但不确定这是否是最佳选择。 我的一个想法是,如果文件可以安全打开,就保留地图并在打开任何文件之前手动检查,如果不能,就让线程等待文件发布

编辑: 有没有办法以独占模式打开fstream?
如果您认为fstream是许多线程环境中使用最差的选项,那么还有什么其他可能性呢?

同步原语(如互斥)非常有用。例如C++11标准库的介绍和介绍


一种可能性是围绕
操作符编写线程安全包装,而不是使用互斥体,您应该使用低级IO库中的锁定机制。因此,将文件名传递给正在实现的流类,并使用文件名创建您自己的fstream对象,但在Operator的实现中,我们特别同意这个答案,因为它不允许同时使用多个读取器。我想不出任何合理的方法让多个读者同时安全地访问
fstream
fstream
通常是缓冲的,因此执行读取操作会改变缓冲区和缓冲区指针。你是对的。也许我应该忘记fstream,应该使用任何其他(windows)IO,有什么想法吗?顺便问一下,使用指向fstream的指针比直接使用fstream有什么好处吗?好的,但这段代码真的有用吗?如果我使用具有相同路径的不同FstreamWriter创建两个FstreamWriter对象会怎么样。这些对象中的每一个都有自己的互斥锁,因此它们可以在有多个线程的同时完全读入。如果输出是面向行的,那么数据不能以这种方式混合在一起吗?锁只存在于处理链中的单个参数时。例如,线程#1:out
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 << "Hello" << 1 << 2 << 3;