IUnknown AddRef和Release介面是執行緒安全的(原子的)嗎?我知道他們所做的是增加/減少參考計數,但我想知道他們是怎么做的。
特別是繼承到 Direct 3D 組件(如 ID3D12DeviceChild)的 IUnknown 介面。如有必要,Direct 3D 的版本為 12。我提到 Direct 3D 的原因是我讀過一個宣告"DirectX APIs are not "true COM""。所以它可能與“真正的 COM”不同。
我感到困惑的原因是由于找不到官方檔案或證明介面在內部使用Interlocked API或使用簡單的增量/減量運算子的證據。
簡單遞增/遞減運算子實作的參考。
ULONG CMyObj::Release()
{
if (--m_dwRef == 0)
{
delete this;
return 0;
}
return m_dwRef;
}
聯鎖 API (1) , (2)的參考資料。
ULONG CMyMAPIObject::Release()
{
// Decrement the object's internal counter.
ULONG ulRefCount = InterlockedDecrement(m_cRef);
if (0 == m_cRef)
{
delete this;
}
return ulRefCount;
}
其他相關參考:
- 使用 COM 編程 DirectX
- IUnknown 的作業原理
- 與大多數 DXGI 介面函式同時使用即時背景關系是無效的。對于 2009 年 3 月和更高版本的 DirectX SDK,唯一安全的 DXGI 函式是 AddRef、Release 和 QueryInterface。
我需要知道它們是否是執行緒安全的,因為我的專案是多執行緒的,所以我應該如何對待它們。如果有人可以提供幫助,將不勝感激。
uj5u.com熱心網友回復:
TL;DR:對于 Direct3D 11、Direct3D 12 和 DXGI,所有IUnknown方法的使用都應該是“執行緒安全的”。
對于 Direct3D 11,方法ID3D11Device都是設計為“執行緒安全”的。的方法ID3D11DeviceContext不是“執行緒安全的”。也就是說,您可以從任何執行緒安全地呼叫AddRef所有Release派生ID3D11DeviceChild類。
對于 Direct3D 12, 的方法ID3D12Device也是“執行緒安全的”。單個命令串列不是“執行緒安全的”,因此您一次只能使用一個執行緒的命令串列介面。請記住,在 Direct3D 12 中,應用程式還負責處理所有 CPU/GPU 同步。
Direct3D設備子物件的一個??關鍵區別是,當它們的參考計數達到 0 時,它們不會立即被清理。由于它使用“延遲銷毀”,它們會在稍后的某個時間點被清理,通常是 aFlush或Present.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/517399.html
下一篇:按一定順序執行執行緒
