繁体   English   中英

c ++ fstream并发访问

[英]c++ fstream concurrent access

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

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

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

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

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

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

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

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

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

  3. 您可以使用DBMS。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM