【问题标题】:Async IO across processes跨进程的异步 IO
【发布时间】:2009-09-29 15:15:58
【问题描述】:

全部:

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

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

【问题讨论】:

    标签: c# overlapped-io


    【解决方案1】:

    在您决定异步 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 上测试过。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我同意互斥锁。但是,如果 IO 发生在不同的机器上(在共享上),则互斥锁对另一台机器是不可见的。这让我想知道 O/S 如何处理重叠的 I/O,以及是否有内置保护来确保一次只发生 1 次写入。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 2010-10-10
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多