这是实现IUnknown COM接口的Release方法的标准(不是推荐的)方式(直接取自MSDN):
ULONG CMyMAPIObject::Release()
{
// Decrement the object's internal counter.
ULONG ulRefCount = InterlockedDecrement(m_cRef);
if (0 == m_cRef)
{
delete this;
}
return ulRefCount;
}
我想知道如果公寓模型不是STA是否会发生竞争情况:
- 说剩下一个参考
- 线程 1 通过调用Release释放它
- 它运行并在之前停止
delete this
- 线程 2 被调度并获得对对象的新引用,例如通过调用QueryInterface或AddRef
- 线程1继续执行并运行
delete this
- 线程 2 留下了一个无效的对象
对我来说,确保一致性的唯一方法是创建一个标志,比如deleted,锁定整个临界区,即除了 return 之外的所有Release方法,并将标志设置为true。
并在AddRef和QueryInterface方法中检查此标志,如果已设置,则拒绝新引用的请求。
我错过了什么?
提前致谢。