如何使用 c 11 CAS 實現 ABA 計數器?
要同時原子地更新兩個值,請建立一個原子的相鄰結構。假設您使用 std::atomic;來實作這一點。然後,將發生以下操作:
- 透過 gcc 編譯在 x86-64 處理器上利用 lock cmpxchg16b 指令。
- 避免內嵌彙編並優先使用 C 語法以提高效率。
- 使用聯合來實現單一結構成員的高效負載。
- 確保16B(或 32 位元指標為 8B)對齊,以防止 x86 架構上的效能問題。
- 對於 x86-64 版本使用 -mcx16,因為早期 x86-64 CPU 並不總是支援 cmpxchg16b。
注意原子物件應該是無鎖的,特別是對於x86 CPU。像 gcc7 及更高版本的編譯器可能會呼叫 libatomic 而不是使用內聯鎖 cmpxchg16b。在這種情況下,請考慮以下事項:
- 驗證編譯器是否產生有效的程式碼來讀取各個成員,而無需求助於該對的 cmpxchg16b 鎖定。
- 確保存取一個聯合成員修改後,另一個是明確定義的實作。這在 GNU C 中是合法的,但如果嚴格遵守 ISO C,可能會導致未定義的行為。
- 確保物件正確對齊,因為未對齊可能會導致 x86 架構上的效能下降。
- 保持 32 位元指標的對齊,因為大於指標的原子物件可能在 x86-64 上使用鎖定CPU。
以下是展示這些特徵的 C 11 程式碼範例:
總之,同時原子地修改兩個值需要仔細的設計、編譯器考慮和對齊最佳化。透過遵循這些準則,您可以使用高效且正確的程式碼在 C 11 中實現無鎖 ABA 計數器。
以上是如何使用 CAS 在 C 11 中實現無鎖定 ABA 計數器並最小化效能開銷?的詳細內容。更多資訊請關注PHP中文網其他相關文章!