使用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 操作需求的替代設計是使用volatile uint64_t 和std::atomic以上是如何僅使用 32 位元原子變數實現 64 位元原子計數器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!