Нужна ли синхронизация внутри FinalConstruct () / FinalRelease ()? - PullRequest
1 голос
/ 01 августа 2011

В моем свободном потоке в COM-объекте с помощью ATL я хочу добавить переменную-член, которая будет установлена ​​только в FinalConstruct() и только для чтения в FinalRelease().Никакой другой код никогда не будет манипулировать этой переменной-членом.

Я сомневаюсь, нужна ли мне синхронизация при доступе к этой переменной-члену.Я внимательно читаю источники ATL и похоже, что эти методы всегда вызываются не более одного раза и, следовательно, только из одного потока.

Это правильное предположение?Можно ли пропустить синхронизацию?

1 Ответ

3 голосов
/ 01 августа 2011

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

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

Что касается FinalConstruct(), ссылка на объект не возвращается ни одному клиенту до завершения FinalConstruct()с успешным кодом возврата.

...