Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重叠I/O:某些功能仍然缺失_C++_C_Windows - Fatal编程技术网

C++ 重叠I/O:某些功能仍然缺失

C++ 重叠I/O:某些功能仍然缺失,c++,c,windows,C++,C,Windows,在Windows API中,我最喜欢的事情之一是重叠I/O。我已经编写了几十个使用重叠I/O(对于套接字和文件)的网络服务器,但线程数量有限。我也是一名驱动程序编写者,因此我很清楚重叠I/O是如何“在幕后”实现的 唯一困扰我的是一些API函数不支持重叠模式。例如,创建文件(即调用CreateFile)总是同步工作。这很遗憾,因为这些方法也可以支持重叠(异步)模式。例如,当创建(或打开)文件时,文件系统驱动程序接收到一个IRP\u MJ\u CREATE请求,它可能(通常)返回STATUS\u P

在Windows API中,我最喜欢的事情之一是重叠I/O。我已经编写了几十个使用重叠I/O(对于套接字和文件)的网络服务器,但线程数量有限。我也是一名驱动程序编写者,因此我很清楚重叠I/O是如何“在幕后”实现的

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


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

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

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

太遗憾了,微软没有跟进(TrustLeap说Bill Stapples声称IIS用户不想要性能,而是想要更高的生产率)


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

我怀疑不存在异步版本,因为
CreateFile
从根本上说是一个阻塞操作:(向下滚动到Creates,以使其更可取消):

创建的内容甚至更可取消

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


你自己说的。如果它丢失了,就无法完成,因为没有对它的系统调用。也许您可以编写一个模拟异步文件创建的驱动程序?编写一个额外的驱动程序是一个不错的选择。我只是希望存在一个我不知道的API。谁说我要使用完成端口?有不同的完成机制:(a)竞争端口,(b)可等待事件,(c)用户APC。你说的完成端口在某种意义上“限制了自由”是对的。但是调用同步函数(它会阻止您,从而窃取您的控制权)根本不是自由,对吗?遗憾。。。从不同线程异步打开文件的另一个问题是,您实际上没有办法中止打开文件的尝试。您可能会杀死该线程,但这反过来会在Vista和更高版本上增加很多混乱(例如每个线程DLL初始化/取消初始化、线程堆栈未释放等问题),至少可以使用
CancelSynchronousIo()
来实现这一点?非常感谢。这可能回答了我的问题。@valdo,是的。我敢打赌,如果将正在进行的未完成CreateFile调用的数量与正在运行的线程数量绑定,就可以防止恶意程序用过多的异步CreateFile调用淹没操作系统。由于CreateFile是一个非常重要的功能(访问元数据,可能生活在网络上,等等),它有助于减少飞行中的数量。因为它们最终会被连续处理。我只是好奇为什么会这样。我有一个“理论”。打开的文件系统对象实际上是由相应的设备驱动程序创建的“设备”实例。不幸的是,I/O管理器的设计方式是,只有在相应的驱动程序处理了创建操作之后,它才会向创建的设备实例返回
句柄。首先,您可以“分配”一个抽象
句柄
。接下来,将其“绑定”到请求的文件系统对象(这里涉及FS驱动程序),并且该操作可以是异步的。既然你已经有了
句柄
-瞧!您可以监视它的状态,也可以随意中止它。@MSN:我不能接受关于“安全”问题的论点。有那么多其他“沉重”的电话,可以“垃圾邮件”的系统一次。我相信还有另外一个原因。