是否可以恢复在挂起的 I/O 操作中使用的已分配 OVERLAPPED 结构?
Is it possible to recover an allocated OVERLAPPED structure used in a pending I/O operation?
假设您正在使用 I/O 完成端口执行异步操作(如 ReadDirectoryChangesW
)。对于函数的每次调用,您分配一个 OVERLAPPED
结构(可能带有一些额外的数据)以供在 I/O 完成回调中使用。然后在回调中,在使用 OVERLAPPED
结构后,使用作为参数提供的指针释放内存。
现在让我们说是时候关闭一切并取消所有挂起的异步调用了。是否可以调用一个函数来检索指向任何当前未决 I/O 操作中使用的 OVERLAPPED
结构的指针,以便释放内存?
Is there a function you can call to retrieve a pointer to the OVERLAPPED structure used in any currently pending I/O operation
不,没有。您有责任跟踪分配给您的 OVERLAPPED
s。
但是,当您取消异步 I/O 操作时,您仍然会收到它的完成通知,表明请求的操作已中止。因此,如果您只是简单地分配 OVERLAPPED
并将它们传递给 IOCP 而无需跟踪它们,那么您可以像往常一样继续在通知处理程序中释放它们的内存。在收到每个待处理的 I/O 操作的完成通知之前,不要完全关闭。
假设您正在使用 I/O 完成端口执行异步操作(如 ReadDirectoryChangesW
)。对于函数的每次调用,您分配一个 OVERLAPPED
结构(可能带有一些额外的数据)以供在 I/O 完成回调中使用。然后在回调中,在使用 OVERLAPPED
结构后,使用作为参数提供的指针释放内存。
现在让我们说是时候关闭一切并取消所有挂起的异步调用了。是否可以调用一个函数来检索指向任何当前未决 I/O 操作中使用的 OVERLAPPED
结构的指针,以便释放内存?
Is there a function you can call to retrieve a pointer to the OVERLAPPED structure used in any currently pending I/O operation
不,没有。您有责任跟踪分配给您的 OVERLAPPED
s。
但是,当您取消异步 I/O 操作时,您仍然会收到它的完成通知,表明请求的操作已中止。因此,如果您只是简单地分配 OVERLAPPED
并将它们传递给 IOCP 而无需跟踪它们,那么您可以像往常一样继续在通知处理程序中释放它们的内存。在收到每个待处理的 I/O 操作的完成通知之前,不要完全关闭。