6

MSDN 关于CreateIoCompletionPort函数中的 CompletionKey 的评论:

使用 CompletionKey 参数帮助您的应用程序跟踪哪些 I/O 操作已完成。CreateIoCompletionPort 不使用此值进行功能控制;相反,它在与 I/O 完成端口关联时附加到 FileHandle 参数中指定的文件句柄。这个完成键对于每个文件句柄应该是唯一的,并且在整个内部完成排队过程中伴随文件句柄。当完成数据包到达时,它在 GetQueuedCompletionStatus 函数调用中返回。PostQueuedCompletionStatus 函数还使用 CompletionKey 参数来对您自己的专用完成数据包进行排队。

上面的评论给我留下了一个问题。为什么要使用 CompletionKey ,因为我们可以将用户上下文与文件句柄以扩展的重叠结构关联起来,如下所示:

typedef struct s_overlappedplus
{
    OVERLAPPED ol;
    int op_code;
    /*we can alternatively put user context over here instead of CompletionKey*/
    LPVOID user_context;
} t_overlappedplus;

并在完成后通过 CONTAINING_RECORD 宏检索?

酷,我只相信 CompletionKey 是每个句柄上下文,而扩展重叠结构是每个 I/O 一个。但是这种设计背后的理念是什么?在什么情况下,就用户上下文而言,有必要使用 CompletionKey 而不是扩展的重叠结构?

4

0 回答 0