4

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

GetQueuedCompletionStatus
PostQueuedCompletionStatus
  1. 当我调用 GetQueuedCompletionStatus 时,WIN32 是 OVERLAPPED 结构的免费实例还是我必须自己做?

  2. 当我使用 PostQueuedCompletionStatus 发送数据时,win32 是否会将其复制到内部结构?何时必须释放已发送数据的内存?

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

4

2 回答 2

4

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

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

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

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

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

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

于 2013-08-14T13:03:01.117 回答
1
  1. 您应该将 a 的地址传递OVERLAPPED *GetQueuedCompletionStatus。这将填充传递给的值PostQueuedCompletionStatus
  2. 您不应该在PostQueuedCompletionStatus上下文中释放这些数据。它应该由上下文使用GetQueuedCompletionStatus. (假设它首先是动态分配的 - 不需要它是动态分配的结构,它可以从固定池中取出,或者分配在一个函数的堆栈上,直到它有已发出操作已完成的信号)。
  3. 我不确定是否有这样的图片。
于 2013-08-14T12:51:55.633 回答