gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:55:59 34 4
gpt4 key购买 nike

我正在创建自己的 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com