一种方法是创建一个包装文件的单个对象,然后将对这个包装器对象的引用提供给需要写入文件的所有对象。在这个包装类内部,对文件的写入是同步的,以便只有一个写入者可以提交要写入的数据(即一个写入者完成写入之前,其他写入者不能写入)。例如:
class SynchronizedFile {
public:
SynchronizedFile (const string& path) : _path(path) {
}
void write (const string& dataToWrite) {
}
private:
string _path;
};
class Writer {
public:
Writer (std::shared_ptr<SynchronizedFile> sf) : _sf(sf) {}
void someFunctionThatWritesToFile () {
_sf->write("Some data to write...");
}
private:
std::shared_ptr<SynchronizedFile> _sf;
};
使用这些写入器的客户端代码将类似于以下内容:
// Create the synchronized file
auto synchronizedFile = std::make_shared<SynchronizedFile>("some/file.txt");
// Create the writers using the same synchronized file
Writer writer1(synchronizedFile);
Writer writer2(synchronizedFile);
使用这种方法,一个单一的对象(类型为SynchronizedFile
)来管理文件,并且所有的写操作都是通过这个对象进行管理的。现在,为了确保只有一个线程可以使用write(const string&)
,需要使用std::lock_guard
这个锁机制。使用这个锁定机制,SynchronizedFile
的实现将类似于:
class SynchronizedFile {
public:
SynchronizedFile (const string& path) : _path(path) {
}
void write (const string& dataToWrite) {
std::lock_guard<std::mutex> lock(_writerMutex);
}
private:
string _path;
std::mutex _writerMutex;
};
因为似乎写入文件不是您的问题,我已经将打开和写入留给您去实现,但上面的片段显示了同步写入的基本结构。如果您在打开和写入文件时遇到问题,请告诉我,我可以帮您解决。
注意:上述片段使用C ++ 11结构。如果您无法使用C ++ 11,请告诉我,我们可以考虑使用C ++ 98(或其他库/ API)来实现相同的结果。