首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果所有线程都写入不同的位置,那么多个线程可以同时写入一个文件吗?

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

Stack Overflow用户
提问于 2011-09-27 14:26:25
回答 4查看 13.9K关注 0票数 7

我正在用c++编写代码。我会遇到任何类型的竞态条件或seg故障吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-27 14:35:30

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

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

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

票数 7
EN

Stack Overflow用户

发布于 2011-09-27 16:37:34

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-09-27 14:36:48

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7565034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档