使用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); } };
代碼實現:
無鎖性: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中文網其他相關文章!