来自MSDN的关于CreateIoCompletionPort函数中的CompletionKey的评论:
使用CompletionKey参数帮助您的应用程序跟踪哪个 I / O操作已完成。该值未被使用 CreateIoCompletionPort用于功能控制;相反,它是附加的 到当时FileHandle参数中指定的文件句柄 与I / O完成端口关联。这个完成键应该 对于每个文件句柄都是唯一的,它随文件句柄一起提供 整个内部完成排队过程。它被退回 完成数据包时调用GetQueuedCompletionStatus函数 到达。 CompletionKey参数也被使用 PostQueuedCompletionStatus函数将您自己的特殊用途排队 完成包。
以上言论给我一个问题。 为什么使用CompletionKey,因为我们可以将用户上下文与extended overlapped structure 中的文件句柄相关联,如下所示:
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而不是扩展重叠结构的情况是什么?