Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Melaksanakan Pembilang Atom 64-Bit Menggunakan Hanya Atom 32-Bit?
Melaksanakan Pembilang Atom 64-Bit dengan Atom 32-Bit
Pengenalan:
Artikel ini membincangkan reka bentuk dan pelaksanaan pembilang atom 64-bit menggunakan 32-bit operasi atom. Ia bertujuan untuk menyediakan akses yang cekap dan bebas kunci ke kaunter kongsi, terutamanya sesuai untuk senario dengan berbilang pembaca dan seorang penulis.
Pertimbangan Reka Bentuk:
Cadangan reka bentuk adalah berdasarkan konsep "SeqLock", yang memanfaatkan kiraan penjanaan 32-bit dengan bit rendah digunakan sebagai kunci baca mekanisme.
Pelaksanaan Kod:
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); } };
Penilaian Reka Bentuk:
Penyelesaian Alternatif:
Adalah penting untuk ambil perhatian bahawa operasi baca-ubah-tulis (RMW) atom mungkin tidak diperlukan untuk operasi kenaikan. Sebaliknya, pendekatan yang lebih cekap ialah menggunakan beban tulen dan stor dengan susunan memori keluaran:
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); }
Kesimpulan:
Pelaksanaan yang dicadangkan menyediakan penyelesaian yang cekap dan betul untuk mencipta pembilang atom 64-bit menggunakan atom 32-bit. Reka bentuk SeqLock memastikan kaunter beroperasi tanpa kunci sambil membenarkan berbilang pembaca dan seorang penulis beroperasi secara serentak tanpa memperkenalkan perlumbaan data.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pembilang Atom 64-Bit Menggunakan Hanya Atom 32-Bit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!