CreateIoCompletionPort功能可以将打开的文件的实例与新创建的或现有的输入/输出完成端口相关联;或者可以创建一个输入/输出完成端口,而不需要将其与文件相关联。
将打开的文件的实例与输入/输出完成端口关联使得应用程序接收到涉及该文件的异步输入/输出操作的完成的通知。
手柄CreateIoCompletionPort(
HANDLE 【FileHandle】, | //与I / O完成端口关联的文件句柄 |
HANDLE【ExistingCompletionPort】, | //现有I / O完成端口的可选句柄 |
DWORD 【CompletionKey】, | // I / O完成数据包的每个文件完成密钥 |
DWORD 【NumberOfConcurrentThreads】 | //允许同时执行的线程数 |
); |
参数
【FileHandle】
处理到打开的重叠输入/输出完成的文件。当使用CreateFile函数获取这样的句柄时,必须指定FILE_FLAG_OVERLAPPED标志。
一旦打开文件的实例与I / O完成端口相关联,则不能在ReadFileEx或WriteFileEx操作中使用。
最好不要通过句柄继承或者调用DuplicateHandle 函数来共享这样的关联文件。使用这种重复句柄完成的输入/输出操作将生成完成通知。
如果【FileHandle】指定INVALID_HANDLE_VALUE,则CreateIoCompletionPort创建一个输入/输出完成端口,而不将其与文件相关联。在这种情况下,【ExistingCompletionPort】参数必须为NULL,并且【CompletionKey】参数将被忽略。
【ExistingCompletionPort】
处理到现有的I / O完成端口。此参数可以为NULL。
如果此参数不为NULL,则指定该函数与【FileHandle】指定的文件相关联的现有完成端口。
如果此参数为NULL,该函数将创建一个与指定文件相关联的新的输入/输出完成端口。
【CompletionKey】
指定将包含在指定文件的每个输入/输出完成数据包中的每个文件完成密钥。
【NumberOfConcurrentThreads】
指定允许并发执行的线程数。
如果其中一个线程进入等待状态,则允许另一个线程继续。当活动线程数超过指定值时,可能会有短暂的时间,但操作系统会快速将数字退回。
此参数的值为0表示操作系统允许与系统中的处理器一样多的线程。
返回值
如果函数成功,则返回值是与指定文件相关联的I / O完成端口的句柄。此返回值不为NULL。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
备注
可以指示Win32 I / O系统将I / O完成通知数据包发送到输入/输出完成端口,并将其排队。CreateIoCompletionPort功能为此提供了一种机制。
当使用具有相关输入/输出完成端口的文件句柄执行输入/输出操作时,I / O操作完成时,I / O系统会向完成端口发送完成通知数据包。I / O完成端口将完成数据包放入先入先出的队列。使用GetQueuedCompletionStatus功能来检索这些排队的I / O完成数据包。
相同进程中的线程可以使用PostQueuedCompletionStatus功能将I / O完成通知数据包放在完成端口的队列中。除了从Win32 I / O系统接收到I / O完成通知数据包之外,还允许您使用端口接收来自进程的其他线程的通信。
也可以看看