如果我有一个COM对象,AddRef()和Release()方法是否需要线程安全-也就是说,我是否必须使用原子操作来处理我的引用计数?
ULONG COutside::AddRef (void)
{
return ++ m_cRef;
}
如果您正在使用自由线程公寓模型,则可以使用InterlockedIncrement()和InterlockedDecrement()来处理引用计数。
是的,这是必需的。COM 是一个简单的二进制标准,如果您使用自由线程公寓,您将获得真正的自由线程访问。
_ATL_*_THREADED
宏的说明。这些宏会影响“通常”类和工厂的AddRef()/Release()
的线程安全性。AddRef()/Release()
线程安全)。AddRef()/Release()
,并且通过指定_ATL_SINGLE_THREADED
宏来实现。AddRef()/Release()
来创建该对象的工厂,但是对象本身可以具有非线程安全的AddRef()/Release()
,通过指定_ATL_APARTMENT_THREADED
宏即可实现。此宏将使所有工厂具有线程安全的AddRef()/Release()
,并且所有对象都具有非线程安全的AddRef()/Release()
。AddRef()/Release()
线程安全,并且您必须指定_ATL_FREE_THREADED
或者不指定上述任何一个 - 这个“最紧密”的宏效果将默认启用。因此,使用ATL创建的COM对象的默认配置是所有对象 - 服务对象和工厂都具有线程安全的AddRef()/Release()
。AddRef()/Release()
是线程安全的,但通常应该这样做,除非您确定可以不使用它,并且不使用它可以让您获得更好的性能。