我们正在编写一个多线程应用程序,它可以完成大量工作并将二进制数据写入磁盘。是否可以让每个线程std::fopen
同一个文件同时写入?原因是每个线程都可以完成其工作并拥有自己对可写文件的访问权限。
答案 0 :(得分:2)
std::fstream
具有根据C stdio库定义的功能。如果实际指定它会让我感到惊讶,但是打开同一文件两次的最可能行为是绑定到同一文件描述符的多个内部缓冲区。
同时写入同一文件中多个点的常用方法是POSIX pwrite
或writev
。此功能不包含在C stdio中,也不包含在C ++ iostream中。但是,对同一个文件系统文件有多个描述符也可能有效。
编辑:在Mac OS X中同一文件上调用两次的POSIX open
会生成不同的文件描述符。因此,它可能适用于您的平台,但它可能不可移植。
明确的答案需要连接这些点:
fstream
的工作方式类似于C(stdio)流。fopen
仅定义为将流与新打开的文件关联)。这比我现在的研究要多一些,但我确信那里有人做过腿部工作。
答案 1 :(得分:1)
我已经编写了一些高速多线程数据捕获实用程序,但输出转到单独的硬盘驱动器上的单独文件,然后进行后处理。
答案 2 :(得分:0)
我似乎记得你可以让fopen不锁定文件,所以理论上允许不同的线程都使用独立的句柄写入同一个文件。在实践中,您将遇到其他问题,即并发性。除非你实现了一些同步,否则你的线程几乎肯定会相互重叠并加扰结果。如果你必须这样做,为什么不在所有线程中使用一个句柄呢?
答案 3 :(得分:0)
I / O访问不是可并行化的任务(它不可能,您根本无法同时通过设备总线发送两个或更多数据地址),因此您最好实现一个队列,其中许多线程发布他们的数据块,一个消费者实际上将它们写入磁盘。