是否可以恢复挂起的 I/O 操作中使用的已分配 OVERLAPPED 结构?

问题描述

假设您正在使用 I/O 完成端口执行异步操作(如 ReadDirectoryChangesW)。对于每次调用函数,您分配一个 OVERLAPPED 结构(可能带有一些附加数据)以在 I/O 完成回调中使用。然后在回调中,在使用 OVERLAPPED 结构后,您使用作为参数提供的指针释放内存。

现在让我们说是时候关闭一切并取消任何挂起的异步调用了。是否有可以调用函数来检索指向任何当前挂起的 I/O 操作中使用的 OVERLAPPED 结构的指针,以便您可以释放内存?

解决方法

是否有可以调用的函数来检索指向任何当前挂起的 I/O 操作中使用的 OVERLAPPED 结构的指针

不,没有。您有责任跟踪分配的 OVERLAPPED

但是,当您取消异步 I/O 操作时,您仍然会收到它的完成通知,表明请求的操作已中止。因此,如果您只是简单地分配 OVERLAPPED 并将它们传递给 IOCP 而没有跟踪它们,那么您可以像往常一样继续在通知处理程序中释放它们的内存。在您收到每个待处理的 I/O 操作的完成通知之前,不要完全关闭。