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

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


MC>>>Нет, не удалять, а уменьшать счетчик на единицу. Счетчик при создании ставить в 1.

_>>ээ.. а если счетчик уже равен 0, то оставлять что ли? если ссылок больше нет, то при закрытии сокета что еще делать остается?
MC>...
_>>получается, что удаление объекта возможно в двух местах (мы ведь не исключаем, что сокет может быть создан, связан с IOCP, но никаких отложенных операций на нем в данный момент нет), а именно: изнутри потока, управляемого IOCP и из потока, который закрывает сокет.

MC>
MC>void Release() {
MC>  if(InterlockedDecrement(&counter) == 0)
MC>    delete object;
MC>}
MC>


т.е. что-то типа метода Release и вызов внутри него delete this — так будет нормально?

MC>Вызываешь Release() после закрытия сокета и по получению (по окончанию обработки) уведомления. После вызова Release не рассчитывай что объект все еще жив, т.к. delete может быть вызван и в том и в другом случае, ты не знаешь точно в каком именно. В конструкторе объекта (вызываемого по открытию сокета) делаешь counter = 1.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.