繁体   English   中英

IO完成端口和OVERLAPPED管理

[英]IO Completion Ports and OVERLAPPED management

win32如何在两个函数的上下文中管理OVERLAPPED结构的实例:

GetQueuedCompletionStatus
PostQueuedCompletionStatus
  1. 当我调用GetQueuedCompletionStatus时,确实是我的自己的win32 free实例的OVERLAPPED结构吗?

  2. 当我使用PostQueuedCompletionStatus发送数据时,win32会将其复制到内部结构吗? 什么时候我必须释放发送数据的内存?

  3. 在哪里可以找到一些在GetQueuedCompletionStatus,PostQueuedCompletionStatus和IOCP队列之间处理OVERLAPPED数据的方案?

OVERLAPPED结构必须存在于成功的I / O操作(或手动PostQueuedCompletionStatus() )执行时,直到OVERLAPPED从对GetQueuedCompletionStatus()的调用中出现。

您负责结构的生命周期。

您将从MSDN文档中看到, GetQueuedCompletionStatus()实际上是“指向一个变量的指针,该变量接收完成的I / O操作启动时指定的OVERLAPPED结构的地址。” 您实际从该调用中得到的是指向您在进行PostQueuedCompletionStatus()调用(或启动重叠的I / O操作)时传递的原始OVERLAPPED的指针。

这实际上非常有用,因为使用OVERLAPPED结构的“正常”方式是将它放在一个更大的结构中,该结构包含您可能需要的所有“每个操作”信息 - 因此它是直接从导航中导航的理想方式。您在调用GetQueuedCompletionStatus()时给出的有限信息,例如,您在重叠读取调用中使用的数据缓冲区...

我发现处理OVERLAPPED结构的最佳方法是a)将它们嵌入到用于读/写的缓冲区中b)引用计数它们和c)当ref count降为0时将它们返回到池中以便重用。

我有一些你可以下载的源代码( 这里 )可能会让它更容易理解(这是一个完整的IOCP服务器示例,所以它有点复杂,但它可以工作并显示如何使用这些东西)。

  1. 您应该将OVERLAPPED *的地址传递给GetQueuedCompletionStatus 这将通过传递给PostQueuedCompletionStatus的值填充。
  2. 您不应该在PostQueuedCompletionStatus上下文中释放此数据。 它应该使用GetQueuedCompletionStatus通过上下文完成。 (假设它是首先动态分配的 - 不要求它是动态分配的结构,它可以从固定池中取出,或者在函数的堆栈上分配,直到它具有已经发出信号表明操作已经完成)。
  3. 我不确定有这样的照片。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM