Почему CompletionKey в порту завершения ввода / вывода? - PullRequest
5 голосов
/ 15 октября 2011

Замечание из MSDN о CompletionKey в CreateIoCompletionPort функция:

Используйте параметр CompletionKey, чтобы помочь вашему приложению отслеживать, какие операции ввода / вывода завершены.Это значение не используется CreateIoCompletionPort для функционального контроля;скорее он присоединяется к дескриптору файла, указанному в параметре 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 является контекстом для каждого дескриптора, в то время как расширенная перекрывающаяся структура - для каждого ввода-вывода.Но какова философия такого дизайна и при каких обстоятельствах может потребоваться использование CompletionKey вместо расширенной перекрывающейся структуры в контексте пользовательского контекста?

...