Структура OVERLAPPED
должна существовать с момента успешной операции ввода-вывода (или вручную PostQueuedCompletionStatus()) выполняется до тех пор, пока OVERLAPPED
не появится из вызова GetQueuedCompletionStatus().
Вы несете ответственность за срок службы конструкции.
Из документов MSDN вы увидите, что GetQueuedCompletionStatus()
на самом деле принимает «указатель на переменную, которая получает адрес структуры OVERLAPPED
, которая была указана при запуске завершенной операции ввода-вывода». На самом деле вы получаете от этого вызова указатель на исходный OVERLAPPED
, который вы передали, когда делали вызов PostQueuedCompletionStatus()
(или инициировали перекрывающуюся операцию ввода-вывода).
Все это на самом деле очень полезно, так как «обычный» способ использования структуры OVERLAPPED
состоит в том, чтобы поместить ее в более крупную структуру, которая содержит всю информацию «для каждой операции», которая может вам понадобиться, так что это идеальный способ навигации непосредственно из ограниченная информация, которую вы получаете, когда вы вызываете GetQueuedCompletionStatus()
, например, буфер данных, который вы использовали в своем перекрывающемся вызове чтения...
Я считаю, что лучший способ справиться со структурами OVERLAPPED
- это а) встроить их в буфер, который вы используете для чтения/записи, б) подсчитать их ссылки и в) вернуть их в пул для повторного использования, когда счетчик ссылок упадет до 0.
У меня есть исходный код, который вы можете скачать (здесь), который может сделать это немного более понятным (это полный пример сервера IOCP, поэтому он немного сложен, но он работает и показывает, как эти вещи можно использовать).
person
Len Holgate
schedule
14.08.2013