Здравствуйте, mr_trwister, Вы писали:
_>если использовать IOCP при обработке сокетов, то во многих примерах, в том числе и Jim Ohlund рекомендуют создать объект — структуру типа PER_HANDLE и ее адрес передавать в качестве CompletionKey при вызове CreateIoCompletionPort. _>такой вопрос: а когда же удалять созданный объект?
Т.е. оно per-handle, то по закрытию этого handle.
_>что меня смущает — это то, что на один сокет может быть задействовано одновременно несколько асинхронных операций. если закрыть сокет, то GetQueuedCompletionStatus сработает несколько раз (для каждой операции). пока все overlapped не обработаются и не удалятся вроде бы как нельзя удалять эту PER_HANDLE. _>а как отследить момент, что все операции по закрытому сокету закончились?
Проще всего — счетчиком.
_>неужели безопасно через CompletionKey передавать только простые значения, которые помещаются в PULONG_PTR ?
Ядру плевать, что ты там передаешь. Но ты сам-то как отличишь указатель на живой объект от указателя на уже удаленный?