這個問題深入研究從 32 位元原子整數建立 64 位元原子計數器。計數器有一個寫入器和多個讀取器,寫入器是不得阻塞的訊號處理程序。
建議的解法採用產生計數,使用低位作為讀取鎖定。讀取器重試,直到生成計數在讀取過程中穩定,且低位未設定。
提供的程式碼通常遵循 SeqLock 的正確設計原則,SeqLock 是一種已知的使用序號實現無鎖原子計數器的模式。記憶體排序的使用是合理的,確保計數器以原子方式更新。
但是,值得注意的是,如果系統支援更便宜的 64 位原子加法或加載。相反,簡單地加載兩半,然後進行非原子增量,並且結果的原子存儲就足夠了。
此外,序列計數器還可以避免原子 RMW 操作,除非它用作自旋鎖多個作家。透過單一編寫器,它可以使用帶有發布排序的純加載和純存儲,這比原子 RMW 或帶有 seq_cst 排序的存儲更有效。
繞過以下限制原子對於較大的類型,可以考慮使用 volatile uint64_t 和atomic
另一種替代方法是實作一個 SeqLock 模板,該模板動態檢查目標是否支援原子
總之,雖然提供的程式碼提供了使用 32 位元原子的 64 位元原子計數器的功能實現,但是可以提高效能並簡化程式碼的潛在最佳化和替代方案。
以上是如何僅使用 32 位元原子來實現 64 位元原子計數器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!