5

如果从不同的进程/线程同时访问文件会发生什么?我知道没有锁定文件的标准方法,只有操作系统特定的功能。

在我的情况下,文件会经常阅读而很少写入。现在如果A打开一个文件进行读取(ifstream)并开始读取块。并B打开同一个文件进行写入(ofstream)并开始写入。会发生什么?有明确的行为吗?

编辑 我的目标是对许多文件进行并发读写访问。但是写访问不会经常发生。如果 fstreams 保证文件内容不会混淆,我会很满意。

例如:进程 1 和 2 写入文件 A。如果它们同时写入,我不关心 1 或 2 的版本是否写入磁盘,只要它是文件的一致版本即可。

如果一个进程读取一个文件,另一个同时写入文件,我希望读取进程获取文件的“旧”版本。

如果 fstreams 不能处理这个问题,我将使用数据库。

4

2 回答 2

7

使用 C++ 进行有效的文件共享(同时访问)肯定没有可移植的方法。

  1. 您可以使用“锁定”文件共享文件。在打开“foo.dat”之前,尝试创建文件“foo.lock”。继续循环直到你成功。访问后,删除 foo.lock。这允许串行访问,但不允许并发访问。

  2. 您可以以特定于平台的方式使用字节级锁定。Windows 有 LockFileEx()。POSIX有fcntl和flock。如果您需要多平台,则需要单独的实现。您可以将它们封装在一个类中并使用#if 来处理特定于平台的位。这是很多时候最有效(最快)的,但它涉及非常复杂的编程并且容易出现错误。

  3. 您可以使用 DBMS。

DBMS 将是最简单的,但它确实将您与可能会或可能不会有问题的外部产品联系在一起。逐字节锁定比其他任何方法都快得多,但会增加很多开发和维护成本。

于 2010-10-29T04:57:03.073 回答
1

你的目标是什么?您是要阻止对文件的并发读/写操作,还是要通过文件实现某种形式的 IPC?

无论哪种方式,看看 boost 进程间,它为您提供了使用文件锁(以及 IPC 的其他很酷的东西)的机会,并且它具有可移植性的额外优势!

于 2010-10-28T11:49:19.657 回答