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

时间:2011-09-27 06:26:25

标签: c++

我正在用c ++编写代码。我可以遇到任何种类的竞争条件或错误吗?

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:4)

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

请注意,由于32位平台上的限制,您将无法映射大于2-3 GB的任何文件,具体取决于架构和可用于执行虚拟内存的实际位数adressing。大多数64位系统有48位或更多可用于此任务,允许您映射至少256 TB,我认为这是绰绰有余。

答案 2 :(得分:2)

这取决于。 文件不是它们的句柄,流不是文件。 这三个不同的概念必须明确。

现在,操作系统可以多次打开文件,返回不同的句柄,每个句柄都有自己的“位置指针”。如果文件以“共享模式”打开以进行读取和写入,则可以根据需要查找所需的句柄和读/写。你没有覆盖的事实取决于你。系统为整个文件或部分文件授予操作的顺序性(但需要有关操作系统的更多信息)

如果每个句柄都附加到不同的流,则每个流将独立于另一个流写入。但是 - 在这种情况下 - 存在“缓冲”的复杂性(写入可以延迟并且可以预期读取:并且可以比您要求的更长:确保通过适当的刷新来正确管理最终重叠)

答案 3 :(得分:1)

当然可以。根据您编写实际代码的方式(即使用该文件),可能会出现竞争条件。此外,如果IO被缓冲,如果缓冲区域重叠,则可能会出现奇怪的事情。