为什么I / O完成端口中的CompletionKey?

时间:2011-10-15 18:03:37

标签: windows multithreading winsock overlapped-io io-completion-ports

来自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而不是扩展重叠结构的情况是什么?

0 个答案:

没有答案