我正在用c++编写代码。我会遇到任何类型的竞态条件或seg故障吗?
发布于 2011-09-27 14:35:30
从底层系统的角度来看,这样做没有问题(对于我所知道的所有系统)。但是,通常您需要完全独立的文件描述符/句柄。这是因为文件描述符会维护状态,例如当前文件位置。
您还需要检查正在使用的文件系统的特定C++接口的线程安全性。除了底层文件系统的线程安全性之外,这也是必需的。
您还应该考虑线程化I/O速度变慢的可能性。系统可能必须串行化对总线的访问。重叠的I/O或通过生产者/消费者管道提供的专用I/O线程可能会获得更好的性能。
发布于 2011-09-27 16:37:34
另一种解决方案是使用memory mapped files,这取决于文件的大小和运行的系统。将文件映射到虚拟内存。这将使您可以直接访问该文件,就像它是一块内存一样。这样,任何数量的线程都可以简单地写入内存区域,随后调用刷新到磁盘的映射(取决于内存映射的配置)将简单地将数据存储在磁盘上。
请注意,由于32位平台上的地址限制,您不可能映射任何通常大于2-3 GB的文件,这取决于体系结构和可用于虚拟内存寻址的实际位数。大多数64位系统有48位或更多位可用于此任务,允许您映射至少256TB,我认为这已经足够了。
发布于 2011-09-27 14:36:48
那得看情况。文件不是它们的句柄,流也不是文件。这三个不同的概念必须明确。
现在,操作系统可以多次打开文件,返回不同的句柄,每个句柄都有自己的“位置指针”。如果文件是以“共享模式”打开的,可以同时读取和写入,您可以在您想要的位置查找句柄,并根据需要进行读取/写入。你不会被覆盖的事实取决于你自己。系统会为整个文件或部分文件授予操作的顺序(但需要有关操作系统的更多信息)
如果每个句柄都附加到不同的流,则每个流将独立于其他流进行写入。但在这种情况下-存在“缓冲”的复杂性(写入可以延迟,读取可以预期:并且可以像您要求的那样更长:确保您通过适当的刷新来正确地管理最终的重叠)( -in )
https://stackoverflow.com/questions/7565034
复制相似问题