Re[2]: Вопросы на собеседовании про многопоточность
От: Aleksey_NN  
Дата: 24.05.11 19:24
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Простой вопрос: поддержка целостности объекта через счетчик ссылок как в COM-t. Написать методы AddRef, Release.


Обычно приводят что-то такое:

void CReferenceCounter::AddRef( void ) {
  ::IntrlockedIncrement( &m_nReferences );
}

void CReferenceCounter::Release( void ) {
  if( !::IntrlockedDecrement( &m_nReferences ) ) {
  delete this;
  }
}


Либо синхронизируют через критическую секцию. А мне вот интересно, тут безопасно разве удалять объект? Если бы синхронизировали критической секцией, она бы была мембером класса, как удалить объект? Выйти из нее — а может в это время другой поток addRef сделает, а потом текущий, думая что счетчик 0, уничтожит. Не выходить из нее тоже нельзя.
Да и тут примерно такая ситуация вроде может быть — зашли в аddRef, в это время другой поток декрементировал и стер объект, и тут мы дошли в первом поток до вызова IntrlockedIncrement(). Может так быть?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.