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