C++ c++;流并发访问

C++ c++;流并发访问,c++,file-io,concurrency,fstream,C++,File Io,Concurrency,Fstream,如果从不同进程/线程并发访问文件,会发生什么情况? 我知道没有锁定文件的标准方法,只有操作系统特定的功能 在我的情况下,文件会经常读,很少写。 现在,如果A打开一个文件进行读取(ifstream),并开始读取块。和B打开相同的文件进行写入(ofstream)并开始写入。会发生什么?是否有明确的行为 编辑 我的目标是对许多文件进行并发读写访问。但是写访问不会经常发生。如果fstreams保证文件内容不会混淆,我会很满意 例如: 进程1和2写入文件A。如果它们同时写入,我不在乎1或2的版本是否写入光

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

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

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

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

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


如果fstreams无法处理此问题,我将使用数据库。

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


不管怎样,看看boost interprocess,它为您提供了使用文件锁(以及IPC的其他很酷的东西)的机会,而且它还有可移植性的额外优势

> P>当然没有可用的方法来使用C++实现高效的文件共享(同时访问)。p>
  • 您可以使用“锁定”文件共享文件。在打开“foo.dat”之前,尝试创建文件“foo.lock”。继续循环直到成功。访问后,删除foo.lock。允许串行访问,但不允许并发访问

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

  • 您可以使用DBMS


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

    正如您所说,这都是特定于操作系统的。你正在使用哪个操作系统?或者你正在寻找一个可移植的解决方案?可移植是首选,但我在linux上。问题是,是否有针对fstream的定义行为……据我所知,没有,没有定义行为。