跨进程的异步IO

时间:2009-09-29 15:15:58

标签: c# overlapped-io

所有

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

(假设当我调用BeginWrite()时,我传递的缓冲区包含应该在一个逻辑“记录”中保存在一起的所有内容)

2 个答案:

答案 0 :(得分: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上测试它。

本文继续为该限制提供可能的解决方案。我认为它们有效,但实际上并未尝试过它们。

我发现最可靠的解决方案是生成一个执行同步写操作的线程。颈部疼痛,真实但有效。

答案 1 :(得分:0)

我不确定你的意思是错误的。如果您使用适当的跨进程互斥锁保护对文件的访问权限,那么即使使用异步I / O,您也只能在给定时间向该文件写入1个进程。这假设你保持互斥锁被锁定,直到异步I / O完成。