函数原型:
HANDLE WINAPI CreateIoCompletionPort(
_In_ HANDLE FileHandle,
_In_opt_ HANDLE ExistingCompletionPort,
_In_ ULONG_PTR CompletionKey,
_In_ DWORD NumberOfConcurrentThreads
);
功能:
1、创建一个输入/输出完成端口(I/O完成端口,I/O Completion Port),并将一个特定的文件句柄和它关联起来。或者创建一个不与文件句柄相关联的I/O完成端口,可以在后面需要的时候再关联文件句柄。
2、将一个一经打开的文件句柄实例和一个I/O完成端口关联起来。这样一来,当在这个文件句柄上的异步I/O操作完成时,进程就会收到通知(notification)。
注:术语文件句柄(File Handle)在这里表示的是一种系统抽象概念,代表一切可重叠的I/O端点,不仅仅是磁盘上的文件。任何支持重叠I/O的系统对象,比如网络端口、TCP套接字、命名管道、邮件槽等都可以被用作文件句柄。
参数详解:
FileHandle:
一个打开的文件句柄或者是 INVALID_HANDLE_VALUE 。
这个句柄必须是支持重叠I/O的对象。并且这个句柄必须是按重叠I/O完成的方式打开的。比如在调用 CreateFile 函数时必须指定 FILE_FLAG_OVERLAPPED 标志。
如果FileHandle的值是INVALID_HANDLE_VALUE 那么函数会创建一个不与文件句柄关联的I/O完成端口。此时ExistingCompletionPort参数必须是NULL,CompletionKey将被忽略。
ExistingCompletionPort:
指向现有的I/O完成端口的句柄或者是NULL。
如果参数指定的是I/O完成端口,函数会将它和 FileHandle 相关联。函数成功时返回现有的I/O完成端口,不会创建新的I/O完成端口。
如果参数是 NULL ,函数会创建一个新的I/O完成端口。此时,如果FileHandle的值是有效的,就会把它和这个端口相关联。否则不会发生任何关联。函数成功时返回一个新的I/O完成端口。
CompletionKey:
每个句柄用户定义的完成键,会被包含在每一个I/O完成数据包里面。
NumberOfConcurrentThreads:
操作系统可以允许的同时处理I/O完成端口的I/O完成数据包的最大线程数。当ExistingCompletionPort不为空时这个参数将被忽略。
如果此参数为零,则系统允许与系统中的处理器一样多的并发运行线程。