被IO完成端口选中并分派了一项IO完成通知的线程。
5)已暂停线程列表
已释放的线程调用了一个函数将自己挂起。也就是说“4)”中某个线程接到了完成通知,并进行了收尾工作,在这个收尾工作中,调用了诸如Sleep函数,将自己挂起了。
从以上的描述可知,IO完成端口维护了多项线程相关的信息,并协调线程共同高效地完成“并发IO请求”。换句话说,IO完成端口是线程通信的调度者。异步io 编程
3,完成通知(Completion Notification)
完成通知与IO请求是相对的。IO请求包含的是发送的信息(OVERLAPPED + buffer),完成通知包含的是返回信息。完成通知具体包含的信息有4项:
1)已传输字节数;
2)完成键值;
3)OVERLAPPED指针;
4)错误码;
三、流程
介绍完了IO完成端口的背景知识和基本原理后,下面开始介绍怎么使用IO完成端口。本文按照Jeffrey的思路来介绍IO完成端口的使用流程,另外还有其他使用流程,可以参考我的博客:EchoAPP和Socket编程之IO完成端口,都配了流程图,它们的使用相对复杂一点。
Jeffrey为了方便使用,将IO完成端口封装为一个类—— class CIOCP ,它将创建完成端口和绑定设备分为两个步骤,见FileCopy.exe示例。我总结其流程大致如下:
注:
1)新开工作线程的数量一般设计为CPU数量的2倍。可以通过Windows API,“GetSystemInfo”来获取CPU信息,参考《Windows核心编程》第14章的“SysInfo.exe”示例。
2)程中开启循环,不让线程函数直接返回,这样可以避免反“复创建和销毁线程”。
四、示例
参考我的博客:EchoAPP和Socket编程之IO完成端口,前者相对要简单一点,是普通设备IO,后者是Socket编程。
五,知识图片
我用一张思维导出总结了《Windows核心编程》关于完成端口的知识点,如下:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-68209-3.html
以后小日本得对我们点头哈腰了
送项目拉动它们的经济