前言
本文不是全面介绍完成端口的,只是简单介绍了一下完成端口和几个常用概念。本文主要关注完成端口关闭时资源释放问题。
基础介绍
完成端口——可能是Win32下最复杂的一种I/O模型,Win32下最复杂的内核对象。它通过指定数量的线程对重叠I/O请求进行管理,以便为已经完成的I/O请求提供服务,相对其它I/O模型,它管理任意数目I/O套接字。假若一个应用程序同时需要管理为数众多的套接字,那么采用这种模型,往往可以达到最佳的系统性能。
通过CreateIoCompletionPort(唯一一个创建内核对象而没有LPSECURITY_ATTRIBUTES参数的Win32函数,这是因为完成端口只应用于进程内)来创建I/O完成端口,当你创建一个I/O完成端口时,内核实际创建了5个不同的数据结构。
- 设备列表。
- I/O完成队列(FIFO)。当一个设备的异步I/O请求完成时,系统检查该设备是否关联了一个完成端口,如果是系统向该完成端口的I/O完成队列加入完成I/O请求项。
- 等待线程队列(LIFO)。当线程池中的一个线程调用