win32如何在两个函数的上下文中管理OVERLAPPED结构的实例:
GetQueuedCompletionStatus
PostQueuedCompletionStatus
最佳答案
从成功执行I / O操作(或手动PostQueuedCompletionStatus())开始直到从对GetQueuedCompletionStatus()的调用出现OVERLAPPED
为止,OVERLAPPED
结构必须存在。
您应对结构的生命周期负责。
您将从MSDN文档中看到GetQueuedCompletionStatus()
实际上采用了“指向一个变量的指针,该变量接收在启动完整的I / O操作时指定的OVERLAPPED
结构的地址”。从该调用中实际得到的是指向进行OVERLAPPED
调用(或启动重叠的I / O操作)时传递的原始PostQueuedCompletionStatus()
的指针。
这实际上非常有用,因为使用OVERLAPPED
结构的“常规”方法是将其放置在较大的结构中,该结构包含您可能需要的所有“每个操作”信息-因此,这是直接从浏览器导航的理想方法调用GetQueuedCompletionStatus()
时获得的有限信息,例如,在重叠的读取调用中使用的数据缓冲区...
我发现处理OVERLAPPED
结构的最佳方法是:a)将它们嵌入到您用于读取/写入的缓冲区中; b)引用计数它们; c)当引用计数降至0时,将它们返回到池中以供重用。
我有一些可以下载的源代码(here),这可能会使它更容易理解(这是一个完整的IOCP服务器示例,因此有点复杂,但它可以工作并显示如何使用这些东西)。