win32如何在两个函数的上下文中管理OVERLAPPED结构的实例:
GetQueuedCompletionStatus
PostQueuedCompletionStatus
当我调用GetQueuedCompletionStatus时,我是否必须通过我自己来实现win32 free实例?
当我使用PostQueuedCompletionStatus发送数据时,win32会将其复制到内部结构吗?什么时候我必须释放发送数据的内存?
在哪里可以找到一些处理过GetQueuedCompletionStatus,PostQueuedCompletionStatus和IOCP队列之间的OVERLAPPED数据的图片?
答案 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)
OVERLAPPED *
的地址传递给GetQueuedCompletionStatus
。这将填入传递给PostQueuedCompletionStatus
的值。 PostQueuedCompletionStatus
上下文中释放此数据。它应该通过使用GetQueuedCompletionStatus
的上下文来完成。 (假设它是首先动态分配的 - 不要求它是动态分配的结构,它可以从固定池中取出,或者在函数的堆栈上分配,直到它具有已经发出信号表明操作已经完成)。