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

GetQueuedCompletionStatus
PostQueuedCompletionStatus
  • 当我调用GetQueuedCompletionStatus时,WIN32是否提供了OVERLAPPED结构的免费实例,还是我必须自己做?
  • 当我使用PostQueuedCompletionStatus发送数据时,win32会将其复制到内部结构吗?我何时必须释放已发送数据的内存?
  • 在哪里可以找到GetQueuedCompletionStatus,PostQueuedCompletionStatus和IOCP队列之间的OVERLAPPED数据处理方案的图片?
  • 最佳答案

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

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

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

    这实际上非常有用,因为使用OVERLAPPED结构的“常规”方法是将其放置在较大的结构中,该结构包含您可能需要的所有“每个操作”信息-因此,这是直接从浏览器导航的理想方法调用GetQueuedCompletionStatus()时获得的有限信息,例如,在重叠的读取调用中使用的数据缓冲区...

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

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

    10-08 03:31