【发布时间】:2014-09-01 09:50:12
【问题描述】:
我有一个文件可以被许多进程读/写,它们使用互斥锁来序列化读/写。
我是否需要在ProcessA 中的WriteFile 之后调用FlushFileBuffers,以便ProcessB 看到这些变化?或者,假设该文件的 OS 磁盘缓存在所有进程之间共享,是否可以保证 ProcessB 看到 ProcessA 所做的更改?在调用WriteFile 之后,我没有在文件上调用CloseHandle,而是在所有进程中保持打开状态,但它们将FILE_SHARE_READ 和FILE_SHARE_WRITE 标志传递给CreateFile。
这是跨 Windows XP 到 Windows 8.1 工作所必需的 - 我发现调用 FlushFileBuffers 会带来不可接受的性能瓶颈。
【问题讨论】:
-
这听起来不像是最好的 IPC 机制。也许您可能会考虑为您的 IPC 使用磁盘文件以外的其他东西。
-
不需要,其他进程也从文件系统缓存中读取。程序可以在 CreateFile() 调用中有意使用 FILE_FLAG_NO_BUFFERING 来绕过缓存。它得到了它应得的东西,读取速度非常慢,并且看不到尚未刷新的写入。
-
你需要假设程序员不是傻瓜。
-
@BenVoigt:我相信他的观点是,当缓存中有更新的信息时,使用
FILE_FLAG_NO_BUFFERING的程序可能会从磁盘读取旧信息(由另一个not 使用标志)。 -
@BenVoigt:这表示缓存管理器和内存管理器不维护一个相互一致的视图,它并没有真正说明每个进程缓存的任何内容(无论哪种方式)。但是在没有关于缓存管理器合同的任何文档的情况下,依赖观察到的行为是不明智的,所以我同意你发布的答案。