首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IUnknown AddRef和发布线程安全吗?

IUnknown AddRef和发布线程安全吗?
EN

Stack Overflow用户
提问于 2022-10-16 15:25:20
回答 1查看 119关注 0票数 0

IUnknown AddRef发布接口是否线程安全(原子)?我知道它们在增加/减少引用数,但我想知道它们是如何做到的。

特别是继承到Direct3D组件(如IUnknown )的ID3D12DeviceChild接口。如果需要的话,Direct3D的版本是12。我之所以提到Direct3D,是因为我读过一个声明"DirectX API不是“真正的COM"”。因此,它可能不同于“真正的COM”。

我之所以感到困惑,是因为找不到正式的文档,或者证明接口内部使用的是互锁API,还是使用简单的增量/减量操作符。

简单增量/递减算子实现参考文献。

代码语言:javascript
复制
ULONG CMyObj::Release()
{
    if (--m_dwRef == 0)
    {
        delete this;
        return 0;
    }
    return m_dwRef;
}

互锁API (1)(2).

代码语言:javascript
复制
ULONG CMyMAPIObject::Release()
{
    // Decrement the object's internal counter.
    ULONG ulRefCount = InterlockedDecrement(m_cRef);
    if (0 == m_cRef)
    {
        delete this;
    }
    return ulRefCount;
}

其他相关参考资料:

我需要知道它们是否是线程安全的,因为我的项目是多线程的,所以我应该如何对待它们。如果有人能帮忙的话,我们会很感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-17 22:15:07

TL;DR: For Direct3D 11、Direct3D 12和DXGI,所有IUnknown方法的使用都应该是“线程安全”。

对于Direct3D 11,ID3D11Device的设计方法都是线程安全的.ID3D11DeviceContext的方法并不是“线程安全”。也就是说,您可以安全地从任何线程调用所有AddRefReleaseID3D11DeviceChild-derived类。

对于Direct3D 12,ID3D12Device的方法也是“线程安全”。单个命令列表并不是“线程安全的”,因此您应该只使用来自一个线程的命令列表接口。请记住,在Direct3D 12中,应用程序还负责处理所有的CPU/GPU同步。

Direct3D设备子对象的一个关键区别是,当它们的引用计数达到0时,它们不会立即被清除。因为它使用的是“延迟销毁”,所以它们在以后的某个时候会被清理干净,通常是一个FlushPresent

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74088322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档