IOCP 开发经验之一

 创建一个输入/输出(I / O)完成端​​口,并将它与一个指定的文件句柄,或创建一个I / O完成端口尚未与文件句柄相关联。

HANDLE WINAPI CreateIoCompletionPort(
  _In_      HANDLE FileHandle,
  _In_opt_  HANDLE ExistingCompletionPort,
  _In_      ULONG_PTR CompletionKey,
  _In_      DWORD NumberOfConcurrentThreads
);
 
 
FileHandle的 []

一个打开的文件句柄或INVALID_HANDLE_VALUE

手柄必须是一个对象,该对象支持重叠的I / O。

如果一个手柄,它具有重叠I / O完成已打开。例如,你必须指定FILE_FLAG_OVERLAPPED标志,使用时 的CreateFile函数来获得这个句柄。

INVALID_HANDLE_VALUE,函数创建一个I / O完成端口,而不与文件句柄相关联。在这种情况下,的ExistingCompletionPort参数必须是NULLCompletionKey参数将被忽略。

ExistingCompletionPort [可选]

现有I / O完成端口或NULL的句柄。

如果此参数指定一个现有I / O完成端口的功能文件句柄参数指定的句柄相关联。该函数返回句柄现有的I / O完成端口,如果成功的话,它不会创建一个新的I / O完成端口。

如果此参数为NULL,则函数创建一个新的I / O完成端口,如果文件句柄参数是有效的,联营公司新的I / O完成端口。否则没有的文件句柄协会发生。该函数返回的句柄到新的I / O端口,如果成功完成。

CompletionKey []

用户定义手柄完成键中包含的每个I / O完成包指定的文件句柄。欲了解更多信息,请参阅“备注”部分。

NumberOfConcurrentThreads []

该操作系统可以允许同时处理I / O完成的I / O完成端口的数据包的最大的线程数。如果不是NULLExistingCompletionPort参数,此参数被忽略

如果该参数为0,则该系统允许尽可能多的并行运行的线程,因为系统中的处理器。

返回值

如果函数调用成功,则返回值是一个I / O完成端口的句柄:

  • 如果的ExistingCompletionPort参数为NULL,则返回值是一个新的手柄。

  • 如果的ExistingCompletionPort参数是一个有效的I / O完成端口句柄,返回值是相同的句柄。

  • 如果文件句柄参数是一个有效的句柄,现在与该文件句柄返回I / O完成端口。

如果函数失败,返回值是NULL。为了得到扩展的错误信息,调用的GetLastError函数功能。

备注

I / O系统,可以指示发送I / O完成通知包到I / O完成端口,他们在那里排队。 CreateIoCompletionPort函数提供此功能。

一个I / O完成端口和它的手柄是与创建它的进程和进程之间不共享。然而,单一的手柄是在同一进程中的线程之间共享。

CreateIoCompletionPort可用于三种不同的模式:

  • 只创建一个不与文件句柄相关联的I / O完成端口。
  • 现有I / O完成端口与文件句柄相关联。
  • 执行创建和协会在一个单一的通话。

要创建一个不相关联的I / O完成端口,设置参数句柄INVALID_HANDLE_VALUENULL参数ExistingCompletionPortCompletionKey参数为零(在这种情况下被忽略)。设置参数NumberOfConcurrentThreads新的I / O完成端口,或零为默认(系统中处理器的数量)到所需的并发值。

句柄传递文件句柄参数可以是任何手柄,支持重叠I / O 最常见的是,这是一个使用FILE_FLAG_OVERLAPPED标志(例如,文件,邮件插槽,管道)的CreateFile函数打开手柄。其他功能,如插座所创建的对象,也可以与同一个I / O完成端口。对于一个示例使用插座,看到的AcceptEx。句柄可以只有一个I / O完成端口相关联,协会后,手柄仍然与I / O完成端口,直到它被关闭相关。

对于I / O完成端口的理论,用法,和相关功能的更多信息,请参阅“ I / O完成端口

一个单一的I / O完成端口通过调用CreateIoCompletionPort多次,与相 ​​同的I / O完成端口手柄在ExistingCompletionPort的参数和不同的文件句柄文件句柄参数每次可以关联多个文件句柄。

使用CompletionKey参数来帮助您的应用程序的I / O操作的轨道已完成。CreateIoCompletionPort功能控制不使用此值,而是附加到指定的文件句柄文件句柄参数在当时协会的I / O完成端口。这个完成的关键应该是唯一的每个文件句柄,它伴随着整个内部完成排队过程中的文件句柄。当一个完成包到达GetQueuedCompletionStatus的函数调用中返回。CompletionKey参数也使用PostQueuedCompletionStatus自己的特殊目的完成包队列功能。

实例后一个打开的句柄相关联的I / O完成端口,它不能被用来在 ReadFileEx或 WriteFileEx功能,因为这些功能都有自己的异步I / O机制。

最好是不要共用一个I / O完成端口可以使用手柄继承或DuplicateHandle函数调用相关的文件句柄 。这样的重复执行的操作处理,生成完成通知。

建议仔细考虑被称为I / O完成端口句柄和每一个文件处理与特定I / O完成端口相关的I / O完成端口。I / O完成端口被释放时,有没有更多的参考资料。因此,所有这些手柄必须正确关闭,以释放I / O完成端口和其相关联的系统资源。满足这些条件后,关闭I / O完成端口句柄调用 CloseHandle的功能。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值