1

全部:

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

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

4

2 回答 2

3

在您决定异步 IO 解决方案之前,请注意,您认为异步写入通常会被同步处理。对于您的日志记录解决方案特别重要的是隐藏在Asynchronous Disk I/O Appears as Synchronous on Windows NT、Windows 2000 和 Windows XP中的一个小花絮。在讨论中埋葬的是这个金块:

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

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

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

我发现的最可靠的解决方案是生成一个执行同步写入的线程。有点脖子疼,真的,但有效。

于 2009-09-29T15:49:54.470 回答
0

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

于 2009-09-29T15:19:41.773 回答