代码之家  ›  专栏  ›  技术社区  ›  valdo

重叠的I/O:一些函数仍然丢失

  •  1
  • valdo  · 技术社区  · 14 年前

    在WindowsAPI中,我真正喜欢的是重叠的I/O。我已经用重叠的I/O(用于套接字和文件)编写了几十个网络服务器,只使用有限数量的线程。我也是一个驱动程序编写者,所以我很清楚“幕后”如何实现重叠的I/O。

    唯一困扰我的是一些API函数不支持重叠模式。例如,创建一个文件(即调用 CreateFile )总是同步工作。这很遗憾,因为这些方法也可以支持重叠(异步)模式。例如,当创建(或打开)文件时,文件系统驱动程序会收到 IRP_MJ_CREATE 请求,它可能(通常)返回 STATUS_PENDING .

    我的问题是:是否仍然有异步打开文件的选项?(但请不要告诉我创建另一个线程来打开文件)。

    3 回复  |  直到 14 年前
        1
  •  1
  •   MSN    14 年前

    我怀疑不存在异步版本,因为 CreateFile 基本上是一个阻塞操作: http://www.osronline.com/article.cfm?article=484 (向下滚动以创建更容易取消):

    创建更容易取消

    你可以想象, 创造有点特别 O/S.1内的操作 特别有趣的是 它们总是同步处理 在I/O管理器中,因此没有 发送异步创建的方法 操作。另外,在以前的版本中 在O/S中,I/O管理器执行 非警报内核等待 创建请求已从内部挂起 司机。因此,即使终止 线程不足以取消 创建用户认为是的请求 时间太长了。

        2
  •  1
  •   Remy Lebeau Ted Lyngmo    14 年前

    抱歉,如果不使用单独的线程,就无法异步打开文件。

        3
  •  1
  •   Frankie    14 年前

    I/O完成端口的问题在于(a)您的自由度太小,(b)尽管在内核中,但它远不是最佳的。在比较Windows和Linux时,TrustLeap最近对这些性能问题发出了很多噪音。

    太遗憾了,微软没有跟进(trustlep说bill stapples声称IIS用户不希望有性能,而是希望有更高的生产力)。

    我想这些位置定义了平台。