【问题标题】:c++ fstream concurrent accessc++ fstream并发访问
【发布时间】:2010-10-28 10:10:37
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 正如你所说,这都是特定于操作系统的。您使用的是哪个操作系统?或者您正在寻找便携式解决方案?
  • 便携式是首选,但我在 linux 上。问题是 fstreams 是否有定义的行为...
  • 据我所知,没有,没有明确的行为。

标签: c++ file-io concurrency fstream


【解决方案1】:

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

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

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

  3. 您可以使用 DBMS。

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

【讨论】:

    【解决方案2】:

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

    不管怎样,看看 boost 进程间,它为您提供了使用文件锁(以及 IPC 的其他很酷的东西)的机会,并且它具有便携性的额外优势!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多