这是实现的标准(不是说推荐的)方法,它是 IUnknown COM 接口(interface)(直接取自MSDN)的版本的方法:
ULONG CMyMAPIObject::Release()
{
// Decrement the object's internal counter.
ULONG ulRefCount = InterlockedDecrement(m_cRef);
if (0 == m_cRef)
{
delete this;
}
return ulRefCount;
}
我想知道如果公寓模型不是 STA ,是否会发生竞赛情况:
delete this
安排
delete this
对我而言,确保一致性的唯一方法是创建一个标志(例如删除),锁定整个关键部分(即除return之外的所有Release方法)并将标志设置为true。
并在AddRef和QueryInterface方法中检查此标志,如果已设置,则拒绝对新引用的请求。
我想念什么?
提前致谢。
最佳答案
仅当它已经引用了IUnknown或该对象实现的其他接口(interface)之一时,它才能执行此操作。为此,之前已进行了AddRef()调用。因此,引用计数永远不能被另一个线程的Release调用减小到小于1的值。
要正确编写代码,必须将ulRefCount与0而不是m_cRef进行比较。
关于c++ - IUnknown.Release标准实现竞争条件吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19142613/