您可以多次打开同一个文件进行写入吗?
Can you open the same file multiple times for writing?
我们正在编写一个多线程应用程序,它做了一堆位处理并将二进制数据写入磁盘。是否有可能让每个线程std::fopen
在同一时间写入相同的文件?原因可能是每个线程都可以做自己的工作,并且对可写文件有自己的访问权限。
std::fstream
具有根据C studio库定义的功能。如果真的指定了,我会很惊讶,但是打开同一个文件两次最有可能的行为是多个内部缓冲区绑定到同一个文件描述符。
通常同时写入同一个文件中的多个点的方法是POSIX pwrite
或writev
。这个功能不是由C studio封装的,扩展后也不是由c++ iostreams封装的。但是,对同一个文件系统文件使用多个描述符也可以。
Edit: POSIX open
在Mac OS X中对同一文件调用两次会产生不同的文件描述符。所以,它可能在你的平台上工作,但它可能不具有可移植性。
一个明确的答案需要把这些点联系起来:
- c++标准指定
fstream
像C (stdio)流一样工作。 - C标准定义了何时创建流(
fopen
只定义了将流与新打开的文件关联)。 - POSIX标准定义了C流的要求。
- POSIX定义了打开同一个文件两次的情况。
这比我现在做的研究要多一点,但我相信有人已经做了跑腿的工作。
我编写了一些高速多线程数据捕获实用程序,但是输出到不同硬盘驱动器上的单独文件,然后进行后处理。
我似乎记得,你可以有fopen不锁定文件,所以在理论上,这将允许不同的线程都写同一个文件与独立的句柄。在实践中,您将遇到其他问题,即并发性。除非实现一些同步,否则线程几乎肯定会相互重叠并扰乱结果。如果必须这样做,为什么不在所有线程中使用一个句柄呢?
I/O访问不是一个可并行的任务(它不可能,你根本不可能同时在设备总线上发送两个或多个数据地址),所以你最好实现一个队列,其中许多线程发布它们的数据块,而一个消费者实际将它们写入磁盘。
相关文章:
- 是否可以在文本文件中找到最长单词的长度,并在同一个文本文件中读取,只需 1 个 while 循环?
- 不同C++文件中未命名命名空间中的名称可以引用同一个命名事物吗?
- 当 PHP、C++ 和 shell 脚本尝试访问同一个文件时,如何避免错误?
- 为什么 boost 文件系统和 libpq-fe 标头不会在同一个文件中编译
- 如何在同一个文件中写入C++
- fopen 和 fwrite 从多个线程到同一个文件
- 将静态和动态库链接到同一个可执行文件会导致哪些问题
- C "undefined reference",但我在同一个文件中指定了它
- DLL使用sqlite3从不同的进程写入同一个数据库文件
- 你能在同一个Cinder文件中发送和接收OSC数据吗
- 我可以允许多个程序同时从同一个文件中读取吗
- 如何检查文件指针/描述符/句柄是否关联到同一个文件/管道/终端
- IO:从一个C++程序和另一个Java程序同时写入和读取同一个文本文件
- 如何同时将 ASCII 和 BINARY 数据写入同一个文件
- C++内联函数的定义必须在同一个文件中
- 我可以在同一个.CPP文件中声明和定义静态类变量吗
- C++使用不同的流读取和写入同一个文件
- 两个进程打开同一个文件进行写入
- C++未定义的引用,尽管函数是在同一个文件中定义的
- 一遍又一遍地创建同一个文本文件