我在Windows API中非常喜欢的一件事是重叠I / O.我使用重叠的I / O(对于套接字和文件)编写了几十个网络服务器,只有有限数量的线程。我也是一名司机作家,所以我很清楚I / O是如何在“幕后”实施的。
唯一一直困扰我的是一些API函数不支持重叠模式。例如,创建文件(即调用CreateFile
)始终同步工作。这很可惜,因为这些方法也可以支持重叠(异步)模式。例如,当创建(或打开)文件时 - 文件系统驱动程序会收到IRP_MJ_CREATE
请求,该请求可能(通常会)返回STATUS_PENDING
。
我的问题是:是否可以选择异步打开文件? (但请不要告诉我创建另一个线程来打开文件)。
答案 0 :(得分:1)
抱歉,如果不使用单独的线程,则无法异步打开文件。
答案 1 :(得分:1)
I / O完成端口的问题在于:(a)你的自由度太少;(b)尽管在内核中,但它远非最佳。在将Windows与Linux进行比较时,TrustLeap最近对这些性能问题发出了很多噪音。
微软没有采取后续行动感到非常难过(TrustLeap称,比尔·斯塔普斯声称IIS用户不想要表演,而是希望提高工作效率)。
我猜这些职位定义了平台。
答案 2 :(得分:1)
我怀疑不存在异步版本,因为CreateFile
基本上是一个阻止操作:http://www.osronline.com/article.cfm?article=484(向下滚动到创建更可取消):
创建更可取消
你可以想象, 创造有点特别 O / S内的操作。一 特别有趣的一点是 它们总是同步处理 在I / O管理器中,所以没有 发送异步创建的方法 操作。此外,在以前的版本中 O / S,I / O管理器执行 一个不可警告的内核等待 内部创建请求 一个司机。因此,甚至终止 线程不足以取消 创建用户认为是的请求 花了太长时间。