这是实现的标准(不是说推荐的)方法,它是 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 ,是否会发生竞赛情况:
  • 说剩下一个引用
  • 线程1通过调用Release
  • 来释放它
  • 它会在delete this
  • 之前运行并停止
    安排
  • 线程2并获取对该对象的新引用,例如通过调用QueryInterface或AddRef
  • 线程1继续执行并运行delete this
  • 线程2留下了无效的对象

  • 对我而言,确保一致性的唯一方法是创建一个标志(例如删除),锁定整个关键部分(即除return之外的所有Release方法)并将标志设置为true。

    并在AddRef和QueryInterface方法中检查此标志,如果已设置,则拒绝对新引用的请求。

    我想念什么?

    提前致谢。

    最佳答案



    仅当它已经引用了IUnknown或该对象实现的其他接口(interface)之一时,它才能执行此操作。为此,之前已进行了AddRef()调用。因此,引用计数永远不能被另一个线程的Release调用减小到小于1的值。

    要正确编写代码,必须将ulRefCount与0而不是m_cRef进行比较。

    关于c++ - IUnknown.Release标准实现竞争条件吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19142613/

    10-13 04:58