I/O完成端口的机制是应用程序在开始去处理异步I/O请求的时候创建线程池的,这些线程创建的目的就是为了
处理I/O请求。相对于I/O请求到达时创建线程,使用I/O完成端口可以使应用程序更快更有效地处理许多并发的异
步I/O请求。
CreateIoCompletionPort 函数可以使一个I/O完成端口关联一个或多个文件句柄,当一个异步I/O操作在一个已
经关联I/O完成端口的文件句柄上完成,一个I/O完成包便加入到这个端口的队列中来,这个可以为多个文件句柄组
合同步点到单个对象中。
一个线程使用函数GetQueuedCompletionStatus等待一个完成包被列入到完成端口中,而不是直接的等待异步
I/O操作的完成,线程会阻塞函数的执行,并以后进先出的顺序来释放包。也就是说,当一个完成包被列入完成端
口中,系统会释放最后一个线程去阻塞在这个端口上函数的执行。
当线程调用函数GetQueuedCompletionStatus,它将关联这个完成端口直到线程退出,或者为他指定不同的完
成端口,或者释放这个完成端口。一个线程最多可以关联一个完成端口。
完成端口最大的特征在于它的并发值,可以在创建一个I/O端口的时候指定它的并发值,这个值限制关联一个
完成端口的运行状态线程的数目,当一个I/O完成端口关联的运行线程的数目达到并发值的时候,系统会阻塞关联
这个端口的线程的创建,直到关联此端口的运行线程数目低于它的并发值。最高效的情况是:有很多完成包在队列
中等待,但是无需等待就可以满足,因为此端口已经达到他并发值。这种情况下,当一个运行的线程调用
GetQueuedCompletionStatus的时候,它会立即接受列入队列的完成包,少了上下文切换的,因为这个运行的线程
不断的接受完成包,其他线程就不能运行。
并发值最好设置为当前计算机CPU的个数。如果您的处理需要长时间的计算,一个大的并发值将允许运行更多
的线程。每次处理也会需要更多的时间来完成,但是可以同时处理多个。在你的应用程序中,是很容易测试达到最
高的效率的并发值的。