首頁 > 後端開發 > C++ > 如何僅使用 32 位元原子變數實現 64 位元原子計數器?

如何僅使用 32 位元原子變數實現 64 位元原子計數器?

Mary-Kate Olsen
發布: 2024-12-11 17:38:19
原創
716 人瀏覽過

How to Implement a 64-bit Atomic Counter Using Only 32-bit Atomic Variables?

使用32 位元原子變數實作64 位元原子計數器

問題:

問題:程式碼:
class counter {
    atomic<uint32_t> lo_{};
    atomic<uint32_t> hi_{};
    atomic<uint32_t> gen_{};

    uint64_t read() const {
        auto acquire = memory_order_acquire;
        uint32_t lo, hi, gen1, gen2;
        do {
            gen1 = gen_.load(acquire);
            lo = lo_.load(acquire);
            hi = hi_.load(acquire);
            gen2 = gen_.load(acquire);
        } while (gen1 != gen2 || (gen1 & 1));
        return (uint64_t(hi) << 32) | lo;
    }

    void increment() {
        auto release = memory_order_release;
        gen_.fetch_add(1, release);
        uint32_t newlo = 1 + lo_.fetch_add(1, release);
        if (newlo == 0) {
            hi_.fetch_add(1, release);
        }
        gen_.fetch_add(1, release);
    }
};
登入後複製

答案:

提供的程式碼是使用32 位元原子變數的64 位元原子計數器的正確實作。它使用一種稱為 SeqLock 的技術,該技術採用生成計數來保持計數器高半部分和低半部分的一致性。

讀取操作在處理時使用循環來獲取計數器的正確狀態讀者和作者之間潛在的競爭條件。寫入操作以原子方式遞增計數器的高位元和低位元部分,使用記憶體排序來確保正確的行為。

改進的實現:

雖然提供的程式碼是正確的,可以對其進行改進以獲得更好的性能和效率:
  • 而不是對計數器有效負載使用原子RMW 操作,它們可以替換為普通加載和存儲,以避免不必要的開銷。
  • 序列計數器也可以用普通載入和儲存來維護,因為它只需要單調遞增而不需要原子更新。

替代設計:

完全消除原子RMW 操作需求的替代設計是使用volatile uint64_t 和std::atomic 的聯合;多變的。易失性部分可用於讀取和寫入值,而原子變數可用於更新序列計數器。這種方法為正確行為提供了必要的保證,同時也優化了效能。

以上是如何僅使用 32 位元原子變數實現 64 位元原子計數器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板