如何在C++中以独占模式打开文件

ran*_*nk1 5 c++ io

我正在用C++实现一些文件系统.到目前为止我正在使用,fstream但我意识到不可能以独占模式打开它.由于有许多线程我想允许多次读取,并且在写入模式下打开文件时我想以独占模式打开文件?
最好的方法是什么?我认为Boost提供一些功能.还有其他可能性吗?我还想看一个简单的例子.如果在C++中做起来不容易/好,我也可以用C语言编写.

我正在使用Windows.

Jam*_*nze 5

在许多操作系统上,这是根本不可能的,因此 C++ 不支持它。您必须编写自己的streambuf. 如果您唯一担心的平台是Windows,您可以使用它提供的独占打开模式。然而,更有可能的是,您希望使用某种更精确的文件锁定,并且在大多数(如果不是所有)平台上都可用(但不是可移植的 -LockFileEx 在 Windows 下,fcntl在 Unix 下需要)。

在 Posix 下,您还可以使用pthread_rwlock. Butenhof 使用 C++11 中存在的经典互斥体和条件变量给出了此实现,因此您实际上可以实现一个可移植版本(假设所有读取器和写入器都在同一进程中 - Posix 请求将跨进程边界,但对于 C++ 线程原语而言并非如此)。


Ran*_*aul 0

如果文件已经以写入模式打开,您可以手动阻止自己打开该文件。只需在内部跟踪您在写入模式下打开的文件即可。

也许您可以散列文件名并将其存储在具有写访问权限的打开表中。这将允许快速查找文件是否已打开。