win32 如何在两个函数的上下文中管理 OVERLAPPED 结构的实例:
GetQueuedCompletionStatus
PostQueuedCompletionStatus
当我调用 GetQueuedCompletionStatus 时,OVERLAPPED 结构的 win32 自由实例还是我必须自己完成?
当我使用 PostQueuedCompletionStatus 发送数据时,win32 是否将其复制到内部结构?我什么时候必须释放已发送数据的内存?
我在哪里可以找到有关 GetQueuedCompletionStatus、PostQueuedCompletionStatus 和 IOCP 队列之间 OVERLAPPED 数据处理方案的图片?
最佳答案
OVERLAPPED
结构必须存在,从成功的 I/O 操作(或手动 PostQueuedCompletionStatus() )执行到 OVERLAPPED
从对 GetQueuedCompletionStatus() 的调用中出现.
您对结构的生命周期负责。
您将从 MSDN 文档中看到 GetQueuedCompletionStatus()
实际上采用“指向变量的指针,该变量接收在完成的 I/O 操作已开始。”。您从该调用中实际得到的是指向原始 OVERLAPPED
的指针,该指针是您在进行 PostQueuedCompletionStatus()
调用(或启动重叠 I/O 操作)时传递的.
这实际上非常有用,因为使用 OVERLAPPED
结构的“正常”方式是将它放在一个更大的结构中,该结构包含您可能需要的所有“每个操作”信息 -因此,这是直接从您调用 GetQueuedCompletionStatus()
时获得的有限信息导航到例如您在重叠读取调用中使用的数据缓冲区的理想方式...
我发现处理 OVERLAPPED
结构的最佳方法是 a) 将它们嵌入到您用于读/写的缓冲区中 b) 对它们进行引用计数 c) 将它们返回到池中以便在引用计数下降到 0 时重用。
我有一些您可以下载的源代码 ( here ) 这可能会使它更容易理解(这是一个完整的 IOCP 服务器示例,所以它有点复杂,但它可以工作并展示了如何使用这些东西).
关于c++ - IO 完成端口和 OVERLAPPED 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18232024/