您可以多次打开同一个文件进行写入吗?

Can you open the same file multiple times for writing?

本文关键字:文件 同一个      更新时间:2023-10-16

我们正在编写一个多线程应用程序,它做了一堆位处理并将二进制数据写入磁盘。是否有可能让每个线程std::fopen在同一时间写入相同的文件?原因可能是每个线程都可以做自己的工作,并且对可写文件有自己的访问权限。

std::fstream具有根据C studio库定义的功能。如果真的指定了,我会很惊讶,但是打开同一个文件两次最有可能的行为是多个内部缓冲区绑定到同一个文件描述符。

通常同时写入同一个文件中的多个点的方法是POSIX pwritewritev。这个功能不是由C studio封装的,扩展后也不是由c++ iostreams封装的。但是,对同一个文件系统文件使用多个描述符也可以。

Edit: POSIX open在Mac OS X中对同一文件调用两次会产生不同的文件描述符。所以,它可能在你的平台上工作,但它可能不具有可移植性。

一个明确的答案需要把这些点联系起来:

  • c++标准指定fstream像C (stdio)流一样工作。
  • C标准定义了何时创建流(fopen只定义了流与新打开的文件关联)。
  • POSIX标准定义了C流的要求。
  • POSIX定义了打开同一个文件两次的情况。

这比我现在做的研究要多一点,但我相信有人已经做了跑腿的工作。

我编写了一些高速多线程数据捕获实用程序,但是输出到不同硬盘驱动器上的单独文件,然后进行后处理。

我似乎记得,你可以有fopen不锁定文件,所以在理论上,这将允许不同的线程都写同一个文件与独立的句柄。在实践中,您将遇到其他问题,即并发性。除非实现一些同步,否则线程几乎肯定会相互重叠并扰乱结果。如果必须这样做,为什么不在所有线程中使用一个句柄呢?

I/O访问不是一个可并行的任务(它不可能,你根本不可能同时在设备总线上发送两个或多个数据地址),所以你最好实现一个队列,其中许多线程发布它们的数据块,而一个消费者实际将它们写入磁盘。