IUnknown AddRef和发布接口是否线程安全(原子)?我知道它们在增加/减少引用数,但我想知道它们是如何做到的。
特别是继承到Direct3D组件(如IUnknown )的ID3D12DeviceChild接口。如果需要的话,Direct3D的版本是12。我之所以提到Direct3D,是因为我读过一个声明"DirectX API不是“真正的COM"”。因此,它可能不同于“真正的COM”。
我之所以感到困惑,是因为找不到正式的文档,或者证明接口内部使用的是互锁API,还是使用简单的增量/减量操作符。
简单增量/递减算子实现参考文献。
ULONG CMyObj::Release()
{
if (--m_dwRef == 0)
{
delete this;
return 0;
}
return m_dwRef;
}ULONG CMyMAPIObject::Release()
{
// Decrement the object's internal counter.
ULONG ulRefCount = InterlockedDecrement(m_cRef);
if (0 == m_cRef)
{
delete this;
}
return ulRefCount;
}其他相关参考资料:
我需要知道它们是否是线程安全的,因为我的项目是多线程的,所以我应该如何对待它们。如果有人能帮忙的话,我们会很感激的。
发布于 2022-10-17 22:15:07
TL;DR: For Direct3D 11、Direct3D 12和DXGI,所有IUnknown方法的使用都应该是“线程安全”。
对于Direct3D 11,ID3D11Device的设计方法都是线程安全的.ID3D11DeviceContext的方法并不是“线程安全”。也就是说,您可以安全地从任何线程调用所有AddRef和Release的ID3D11DeviceChild-derived类。
对于Direct3D 12,ID3D12Device的方法也是“线程安全”。单个命令列表并不是“线程安全的”,因此您应该只使用来自一个线程的命令列表接口。请记住,在Direct3D 12中,应用程序还负责处理所有的CPU/GPU同步。
Direct3D设备子对象的一个关键区别是,当它们的引用计数达到0时,它们不会立即被清除。因为它使用的是“延迟销毁”,所以它们在以后的某个时候会被清理干净,通常是一个Flush或Present。
https://stackoverflow.com/questions/74088322
复制相似问题