c ++ fstream并发访问

tau*_*ran 4 c++ concurrency file-io fstream

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

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

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

例如:进程1和进程2写入文件A.如果它们同时写入,我不在乎是否将1或2的版本写入光盘,只要它是文件的一致版本即可.

如果进程读取文件而另一个进程同时写入该文件,我希望读取过程获得该文件的"旧"版本.

如果fstreams没有处理这个,我将使用数据库.

Mic*_*l J 7

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

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

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

  3. 您可以使用DBMS.

DBMS将是最简单的,但它确实将您与外部产品联系起来,这可能是也可能不是问题.字节锁定比其他任何东西都快得多,但会增加很多开发和维护成本.