2009-09-29 61 views
1

全部:跨进程的异步IO

我在写日志解决方案。其中一个可用的日志端点是一个文本文件。假设我想从多个进程写入该文件:我可以打开它共享的文件,并使用命名的互斥体来控制并发访问文件(假设所有访问都发生在同一台机器上)。但后来我开始怀疑异步IO。在一个进程中,我可以使用BeginWrite异步发布我的写入。跨进程或跨机器问题呢?在这些情况下,异步IO是否安全?

(假定当我调用BeginWrite(),我通过缓冲区包含应该在一个合理的“记录”放在一起的一切)

回答

3

在您决定使用异步IO解决方案之前,请注意,您经常认为异步写入最终会被同步处理。对于您的日志记录解决方案特别重要的是在Asynchronous Disk I/O Appears as Synchronous on Windows NT, Windows 2000, and Windows XP中隐藏一小段消息。在这里讨论的是这个块:

“在Windows NT上,对扩展其长度的文件的任何写操作都是同步的。”

虽然说“Windows NT”,但我的经验是,Windows 2000,Windows XP和Server 2003也是如此。我认为他们的意思是“NTFS”而不是“Windows NT”。我还没有在Vista或Server 2008上测试它。

该文章继续为该限制提供可能的解决方案。我假设他们工作,但实际上没有尝试过。

我找到的最可靠的解决方案是产生一个执行同步写入的线程。脖子上的一种痛苦,真实但有效。

0

我不知道你错了意思。如果您正在使用适当的跨进程互斥锁守护文件,那么即使使用异步I/O,您在给定时间也只会有1个进程写入文件。假定您保持互斥锁锁定,直到异步I/O完成。

+0

我同意互斥。但是,如果IO发生在不同的机器上(共享上),则互斥体对另一台机器将不可见。这让我想知道O/S如何处理重叠的I/O,以及是否内置保护以确保一次只发生一次写入。 – JMarsch 2009-09-29 16:31:47