Это будет зависеть от используемой модели потоков и типа объекта.Пожалуйста, смотрите описание _ATL_*_THREADED
макросов .Эти макросы влияют на потокобезопасность AddRef()/Release()
«обычных» классов и фабрик.
Если вы используете «слишком свободный» макрос, вы нарушаете требования безопасности потоков и ваша программа может работать со сбоями.Если вы выберете «слишком узкий» макрос, вы можете потерять некоторую производительность, но вы, как обычно, не знаете, заботитесь ли вы, прежде чем профиль.
Вот как вы выбираете правильный макрос (и это объясняет, является ли AddRef()/Release()
должен быть потокобезопасным).
Если во всех классах одного сервера не указана модель потоков (Main STA), то нет возможности одновременного доступа к объектам или фабрикам, и все они могут иметь не-threadsafe AddRef()/Release()
, и вы получите это, указав макрос _ATL_SINGLE_THREADED
.
В противном случае, если хотя бы в одном классе указана модель "Квартира", вам необходимо поточно-ориентированное AddRef()/Release()
для фабрики этого объекта, но все жеможет иметь не-потокобезопасный AddRef()/Release()
в самом объекте, и вы получите это, указав макрос _ATL_APARTMENT_THREADED
.Этот макрос заставит все фабрики иметь потокобезопасный AddRef()/Release()
и весь объект - не-потокобезопасный AddRef()/Release()
.
Наконец, если хотя бы в одном классе указана нужная вам модель потоков «Оба» или «Свободная» AddRef()/Release()
, чтобы быть потокобезопасным как в этом классе, так и на фабрике, и вы должны либо указать _ATL_FREE_THREADED
, либо просто не указывать ничего из вышеперечисленного - этот «наиболее узкий» макроэффект будет включен по умолчанию.Поэтому конфигурация по умолчанию для COM-объектов, созданных с использованием ATL, должна иметь поточно-ориентированный AddRef()/Release()
для всех объектов - как обслуживаемых объектов, так и фабрик.
При этом вам не всегда нужно, чтобы AddRef()/Release()
был поточным.безопасно, но обычно вам следует делать это, если вы точно не знаете, что можете обойтись без него, а что без него позволяет повысить производительность.