MSDN]完成端口 CreateIoCompletionPort

来源:互联网 发布:网络机房装修招聘 编辑:程序博客网 时间:2024/04/30 19:09

CreateIoCompletionPort

该函数将一个完成端口和一个资源句柄关联在一起;比如一个或更多文件句柄,或者别的什么。把完成端口和一个打开的文件的实例关联起来会使得应用方能够收到异步响应通知该文件的一个IO操作已经完成。

HANDLE CreateIoCompletionPort(HANDLE FileHandle,HANDLE ExistingCompletionPort,ULONG_PTR CompletionKey,DWORD NumberOfConcurrentThreads);

参数

FileHandle
[输入参数] 完成端口用来关联的一个文件句柄,当你使用CreateFile函数创建文件句柄的时候你必须指定该句柄包含FILE_FLAG_OVERLAPPED标志位。
如果FileHandle 的值是INVALID_HANDLE_VALUE, CreateIoCompletionPort 将会创建一个不和任何文件关联的完成端口;在这种情况下,参数 ExistingCompletionPort 必须是 NULL 并且参数CompletionKey 的内容将会被无视。
ExistingCompletionPort
[输入参数] 完成端口的句柄。
如果这个参数指向一个已经存在的完成端口,这个函数将会把这个完成端口和FileHandle 关联起来。这个函数的返回值就是这个已经存在的完成端口的句柄,他将不会再新建一个完成端口;如果这个参数是NULL,这个函数就会创建一个新的完成端口并且把它和FileHandle关联起来,这个函数的返回值将会是这个新建的完成端口的句柄。
CompletionKey
[输入参数] 在用CreateIoCompletionPort关联socket时,要分配一个与此socket关联的结构体。
这样,完成端口、socket和与其关联的结构体,这三者就联系起来了, 在GetQueuedCompletionStatus时就得到了:
“是谁(哪个socket)在指定完成端口上完成了操作” 以及 “与这个谁(socket)关联的结构体在哪儿”。
这样,用户,也就是写代码的人,就不必去记住自己以前把哪个socket与哪个结构体给关联了--只需用一个指针把结构体的地址给取回来就是。
NumberOfConcurrentThreads
[输入参数] NumberOfConcurrentThreads告诉系统一个完成端口上同时允许运行的线程最大数。在默认情况下,所开线程数和CPU数量相同,经验公式:  线程数 = CPU数 * 2 + 2。若将该参数设为0,表明系统内安装了多少个处理器,便允许同时运行多少个线程!

返回值

如果函数执行成功,返回值一定是一个完成端口的地址;如果函数执行失败,返回NULL。可以调用GetLastError函数去获得详细的错误信息。

备注

IO系统可以指示发送IO完成通知到完成端口,他们在那里排队, CreateIoCompletionPort 函数提供了这个功能。

完成端口的句柄是一个智能指针,没有人调用它它就会被释放。如果想要释放完成端口的句柄,每个与它关联的文件的句柄都必须被释放,然后调用CloseHandle 函数去释放完成端口的句柄。

与完成端口关联的文件句柄不能够再被 ReadFileEx 或者 WriteFileEx 函数调用。最好是不要分享这种关联的文件或者继承或调用DuplicateHandle函数。这种复制句柄的操作将会产生完成消息通知。

当您执行一个文件的I / O操作处理具有关联的I / O完成端口,在I / O操作完成时I / O系统发送完成通知包到完成端口。该I / O完成端口地完成包在一个先入先出队列。使用GetQueuedCompletionStatus函数来检索这些排队的I / O完成数据包。
在同一进程中线程可以使用PostQueuedCompletionStatus函数放置在一个完成端口的队列中的I / O完成通知包。通过这样做,你可以使用完成端口去接收从进程的其他线程通信,除了接受来自I / O系统的I / O完成通知包。

Requirements

Client: Included in Windows XP, Windows 2000 Professional, and Windows NT Workstation 3.5 and later.
Server: Included in Windows Server 2003, Windows 2000 Server, and Windows NT Server 3.5 and later.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.

 

http://blog.csdn.net/iiye/article/details/5642478

原创粉丝点击