CreateIoCompletionPort関数の CompletionKey に関する MSDN からのコメント:
CompletionKey パラメーターを使用して、どの I/O 操作が完了したかをアプリケーションが追跡できるようにします。この値は、機能制御のために CreateIoCompletionPort によって使用されません。むしろ、I/O 完了ポートとの関連付け時に FileHandle パラメータで指定されたファイル ハンドルにアタッチされます。この完了キーは、ファイル ハンドルごとに一意である必要があり、内部完了キュー プロセス全体でファイル ハンドルに付随します。完了パケットが到着すると、GetQueuedCompletionStatus 関数呼び出しで返されます。CompletionKey パラメータは、PostQueuedCompletionStatus 関数によっても使用され、独自の特殊目的の完了パケットをキューに入れます。
上記の発言は私に疑問を残します。次のように拡張されたオーバーラップ構造でユーザー コンテキストをファイル ハンドルに関連付けることができるのに、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 を使用する必要があるのでしょうか?