Здравствуйте, 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(). Может так быть?