如果所有线程都写到不同的位置,多个线程可以同时写到一个文件吗?

Can multiple threads write into a file simultaneously, if all the threads are writing to different locations?

本文关键字:线程 一个 文件 如果 位置      更新时间:2023-10-16

我正在用c++编写代码。我能遇到任何比赛条件或赛区故障吗?

从底层系统(对于我所知道的所有系统)的角度来看,这样做没有问题。但是,通常需要有完全独立的文件描述符/句柄。这是因为文件描述符维护状态,例如当前文件位置。

您还需要检查您正在使用的文件系统的特定c++接口的线程安全性。除了底层文件系统的线程安全之外,这也是必需的。

您还应该考虑线程I/O会变慢的可能性。系统可能必须序列化对总线的访问。通过生产者/消费者管道提供的重叠I/O或专用I/O线程可以获得更好的性能。

另一个解决方案是使用内存映射文件,这取决于文件的大小和您正在运行的系统。将文件映射到虚拟内存。这将使您可以直接访问文件,就像它是一块内存一样。这样,任何数量的线程都可以简单地写入内存区域,随后调用将映射刷新到磁盘(取决于您对内存映射的配置)将简单地将数据存储在磁盘上。

请注意,由于32位平台上的寻址限制,您不可能映射任何大于2-3 GB的文件,这取决于体系结构和可用于进行虚拟内存寻址的实际位数。大多数64位系统都有48位或更多的可用空间用于此任务,允许您至少映射256 TB,我认为这已经足够了。

看情况。文件不是它们的句柄,流也不是文件。这三个不同的概念必须清楚。

现在,操作系统可以多次打开文件,返回不同的句柄,每个句柄都有自己的"位置指针"。如果文件以"共享模式"打开,既可以读也可以写,你可以在你想要的地方寻找句柄,并按你喜欢的方式读/写。你不重写取决于你自己。系统为整个文件或部分文件授予操作的顺序性(但需要有关操作系统的更多信息)

如果每个句柄都连接到不同的流,则每个流将独立于其他流进行写操作。但是在这种情况下,存在"缓冲"的复杂性(写入可以延迟,读取可以预期;并且可以比您要求的时间更长:确保通过适当的刷新来适当地管理最终的重叠)

当然可以。竞争条件可能会发生,这取决于您如何编写实际代码(即使用该文件)。此外,如果缓冲IO,如果缓冲区域重叠,可能会出现奇怪的事情。