Re[2]: IOCP + CompletionKey - когда удалять объект?
От: mr_trwister  
Дата: 12.03.08 13:26
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Здравствуйте, mr_trwister, Вы писали:


_>>если использовать IOCP при обработке сокетов, то во многих примерах, в том числе и Jim Ohlund рекомендуют создать объект — структуру типа PER_HANDLE и ее адрес передавать в качестве CompletionKey при вызове CreateIoCompletionPort.

_>>такой вопрос: а когда же удалять созданный объект?

MC>Т.е. оно per-handle, то по закрытию этого handle.


не все так просто =)
в момент закрытия handle нельзя сразу же удалять этот объект. он еще может быть должен жить некоторое время.
т.е. можно обозначить, что он должен быть удален не ранее, чем будет закрыть handle. но не более того.

_>>что меня смущает — это то, что на один сокет может быть задействовано одновременно несколько асинхронных операций. если закрыть сокет, то GetQueuedCompletionStatus сработает несколько раз (для каждой операции). пока все overlapped не обработаются и не удалятся вроде бы как нельзя удалять эту PER_HANDLE.

_>>а как отследить момент, что все операции по закрытому сокету закончились?

MC>Проще всего — счетчиком.


ага! каждая новая overlapped будет увеличивать счетчик, а ее удаление будет уменьшать. останется только потокобезопасность предусмотреть.

_>>неужели безопасно через CompletionKey передавать только простые значения, которые помещаются в PULONG_PTR ?


MC>Ядру плевать, что ты там передаешь. Но ты сам-то как отличишь указатель на живой объект от указателя на уже удаленный?


да я это понимаю. просто ни в одном примере я не встретил того, чтобы эту ситуацию как-либо учитывали.

что же получается — после закрытия handle удалять объект, если ссылок на него больше нет. а если есть, то оставить на откуп потоку в IOCP, чтобы последняя OVERLAPPED операция проверила счетчик и удалила? или вообще периодически пробегать по списку handle и чистить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.