![](/img/trans.png)
[英]Windows: Event-based Overlapped IO vs IO Completion Ports, Real World Performance
[英]IO Completion Ports and OVERLAPPED management
win32如何在两个函数的上下文中管理OVERLAPPED结构的实例:
GetQueuedCompletionStatus
PostQueuedCompletionStatus
当我调用GetQueuedCompletionStatus时,确实是我的自己的win32 free实例的OVERLAPPED结构吗?
当我使用PostQueuedCompletionStatus发送数据时,win32会将其复制到内部结构吗? 什么时候我必须释放发送数据的内存?
在哪里可以找到一些在GetQueuedCompletionStatus,PostQueuedCompletionStatus和IOCP队列之间处理OVERLAPPED数据的方案?
OVERLAPPED
结构必须存在于成功的I / O操作(或手动PostQueuedCompletionStatus() )执行时,直到OVERLAPPED
从对GetQueuedCompletionStatus()的调用中出现。
您负责结构的生命周期。
您将从MSDN文档中看到, GetQueuedCompletionStatus()
实际上是“指向一个变量的指针,该变量接收完成的I / O操作启动时指定的OVERLAPPED
结构的地址。” 您实际从该调用中得到的是指向您在进行PostQueuedCompletionStatus()
调用(或启动重叠的I / O操作)时传递的原始OVERLAPPED
的指针。
这实际上非常有用,因为使用OVERLAPPED
结构的“正常”方式是将它放在一个更大的结构中,该结构包含您可能需要的所有“每个操作”信息 - 因此它是直接从导航中导航的理想方式。您在调用GetQueuedCompletionStatus()
时给出的有限信息,例如,您在重叠读取调用中使用的数据缓冲区...
我发现处理OVERLAPPED
结构的最佳方法是a)将它们嵌入到用于读/写的缓冲区中b)引用计数它们和c)当ref count降为0时将它们返回到池中以便重用。
我有一些你可以下载的源代码( 这里 )可能会让它更容易理解(这是一个完整的IOCP服务器示例,所以它有点复杂,但它可以工作并显示如何使用这些东西)。
OVERLAPPED *
的地址传递给GetQueuedCompletionStatus
。 这将通过传递给PostQueuedCompletionStatus
的值填充。 PostQueuedCompletionStatus
上下文中释放此数据。 它应该使用GetQueuedCompletionStatus
通过上下文完成。 (假设它是首先动态分配的 - 不要求它是动态分配的结构,它可以从固定池中取出,或者在函数的堆栈上分配,直到它具有已经发出信号表明操作已经完成)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.