c++ - 在多线程中安全使用 fstream 有哪些选项

标签 c++ multithreading fstream

我正在创建自己的 IOsystem,它使用 fstream。将会有很多线程,我的问题是如何保证它的安全,这意味着允许从一个文件进行多次读取,但保持独占写入。因此,例如,如果有两个线程想要写入文件,我希望第二个线程等待,直到第一个线程关闭其 fstream。 这里Accessing a single file with multiple threads 建议使用 TMultiReadExclusiveWriteSynchronizer 但不确定它是否是最佳选择。 我的想法之一是保留 map 并在打开任何文件之前手动检查文件是否可以安全打开,如果不能使线程等待文件被释放。

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

最佳答案

诸如互斥锁之类的同步原语很有帮助。例如C++11标准库介绍 std::mutex std::lock_guard .

一种可能性是围绕 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 等,它们都具有互斥锁。但主要结构都是一样的

关于c++ - 在多线程中安全使用 fstream 有哪些选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15973428/

相关文章:

c++ - 如何使用单个解锁方法实现 C++ Reader-Writer 锁,可以称为读取器或写入器?

C++ fstream 只保存字符串的第一个字符

c++ - 无法用 C++ 打开 file.txt

c++ - 在每次 std::ofstream 调用时覆盖文件内容

c++ - STL:存储引用或值?

c++ - Visual Studio C++ Express 2010 - 它是否适用于非托管代码?

c++ - 在 Windows 中查找扬声器输出的当前音量级别

c++ - 如何在不将它们作为参数传递的情况下访问线程中的类数据成员?

c++ - 默认情况下,final 类的方法是否应用于函数指针优化?

python - 线程启动后如何更改其特性?