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

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

Barbara Streisand
發布: 2025-01-04 16:52:39
原創
566 人瀏覽過

How to Implement a 64-Bit Atomic Counter Using Only 32-Bit Atomics?

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

簡介:

簡介:

本文介紹了64 位元原子計數器的設計與實現,使用32 位元原子操作。它旨在提供對共享計數器的高效、無鎖訪問,特別適合具有多個讀取器和單個寫入器的場景。

設計注意事項:

建議的設計是基於「SeqLock」的概念,它利用 32位生成計數,其中低位用作讀鎖

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);
    }
};
登入後複製

代碼實現:

  1. 設計評估:
  2. 正確性: 設計提供了64位元原子計數器的有效實現,防止競爭條件並確保所有執行緒都看到一致的值。
  3. 效率:使用 32 位元原子而不是 64 位元原子可以提高效能,特別是在 64 位元原子操作成本高昂的系統中。

無鎖性:SeqLock設計消除了對鎖的需求,從而實現高並發訪問

替代解決方案:
void increment() {
    auto release = memory_order_release;
    uint64_t count = lo_.load(release) | (uint64_t(hi_.load(release)) << 32);
    count++;
    lo_.store(count & uint32_t(-1), release);
    hi_.store((count >> 32) & uint32_t(-1), release);
}
登入後複製

需要注意的是,原子讀-修改-寫(RMW)操作對於增量操作。相反,更有效的方法是使用帶有釋放記憶體排序的純載入和儲存:

結論:建議的實作提供了一個高效且正確的解決方案用於使用32 位元原子建立64 位元原子計數器。 SeqLock 設計確保計數器在無鎖定的情況下運行,同時允許多個讀取器和單個寫入器同時操作,而不會引入資料競爭。

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

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