Да, предположение верно.Думайте об этом как о расширении конструктора и деструктора C ++.Теоретически вы можете вызывать метод для COM-объекта из другого потока, пока выполняется FinalRelease()
.Хотя это неопределенное поведение, а не ожидаемое событие.Вы не должны пытаться защитить себя от этого, так же, как вы не пытаетесь защитить себя от других потоков в деструкторе.Если вам нужно защитить себя в деструкторе, дизайн, как правило, нарушен (это будет означать, что у вас нет правильного протокола завершения между вашими потоками).
Единственный способ FinalRelease()
можно вызвать из другогопоток - это когда в клиентском коде нет действительного количества ссылок на ваш объект или если некоторые другие части вашего кода выпускаются дважды.Это серьезная ошибка, и в любом случае она, вероятно, приведет к сбою, совершенно не связанному с любыми ошибками синхронизации, которые могут у вас возникнуть.Код ATL для управления счетчиком ссылок на объекты является потокобезопасным и не оставляет открытых условий гонки.
Что касается FinalConstruct()
, ссылка на объект не возвращается ни одному клиенту до завершения FinalConstruct()
с успешным кодом возврата.