IO完成端口和OVERLAPPED管理

时间:2013-08-14 12:40:01

标签: c++ winapi iocp

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

GetQueuedCompletionStatus
PostQueuedCompletionStatus
  1. 当我调用GetQueuedCompletionStatus时,我是否必须通过我自己来实现win32 free实例?

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

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

2 个答案:

答案 0 :(得分:4)

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

您应对结构的生命周期负责。

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

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

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

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

答案 1 :(得分:1)

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