HANDLE WINAPI CreateIoCompletionPort(
__in HANDLE FileHandle,
__in HANDLE ExistingCompletionPort,
__in ULONG_PTR CompletionKey,
__in DWORD NumberOfConcurrentThreads
);
一个I/O完成端口关联一个或多个文件句柄,也可以在创建I/O完成端口的时候 没有关联任何文件句柄。
一个I/O完成端口关联一个打开文件的实例使应用程序可以收到包括这个文件异步I/O操作的完成通知。
参数:
FileHandle 打开重叠IO完成端口的文件句柄
如果设置这个参数为INVALID_HANDLE_VALUE,那 么,CreateIoCompletionPort 会创建一个不关联任何文件的完成端口,而且ExistingCompletionPort 必须设置为NULL,CompletionKey 也将被忽略。
ExistingCompletionPort 完成端口句柄
如果指定一个已经存在的完成端口,函数将关联FileHandle 指定的文件,并返回已存在的完成端口句柄,函数不会创建一个新的完成端口。
如果这个参数为NULL,函数创建一个与FileHandle指定的文 件关联的完成端口,并返回一个新的完成端口句柄。
CompletionKey 单文件句柄,包含指定文件每次IO完成包数据信息。
NumberOfConcurrentThreads 系统允许在完成端口上并发处理IO完成包的最大线程数量。
如果 ExistingCompletionPort 为NULL,此参数忽略
返回值:
如果执行成功,函数返回关联指定文件的完成端口句柄;否则,返回NULL
备注:
CreateIoCompletionPort 提供这个功能:I/O系统可以被用来向列队的I/O完成端口发送I/O完成通知包。
当 你执行一个已经关联一个完成端口的文件I/O操作,I/O系统将会在这个I/O操作完成的时候向I/O完成端口发送一个完成通知包,I/O完成端口将以先 进先出的方式放置这个I/O完成通知包,并使用GetQueuedCompletionStatus 接收I/O完成通知包。
虽然允许任何数量的 线程来调用GetQueuedCompletionStatus 等待一个I/O完成端口,但每个线程只能同时间内关联一个I/O完成端口,且此端口是线程最后检查的那个端口。
当一个包被放入队列中,系统首先会 检查有多少个关联此端口的线程在运行,如果运行的线程的数量少于NumberOfConcurrentThreads的值,
那么允许其中的一个等 待线程去处理包。当一个运行的线程完成处理,将再次调用GetQueuedCompletionStatus ,此时系统允许另一个等待线程去处理包。
系 统也允许一个等待的线程处理包如果运行的线程进入任何形式的等待状态,当这个线程从等待状态进入运行状态,可能会有一个很短的时期活动线程的数量会超过 NumberOfConcurrentThreads 的值,此时,系统会通过不允许任何新的活动线程快速的减少线程个数,直到活动线程少于NumberOfConcurrentThreads 的值。