Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Melaksanakan Pembilang Atom 64-Bit Menggunakan Hanya Atom 32-Bit?

Bagaimana untuk Melaksanakan Pembilang Atom 64-Bit Menggunakan Hanya Atom 32-Bit?

Barbara Streisand
Barbara Streisandasal
2025-01-04 16:52:39566semak imbas

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

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:

  1. Ketepatan: Reka bentuk menyediakan pelaksanaan yang sah bagi pembilang atom 64-bit, menghalang keadaan perlumbaan dan memastikan semua benang melihat nilai yang konsisten.
  2. Kecekapan: Penggunaan atom 32-bit dan bukannya atom 64-bit meningkatkan prestasi, terutamanya dalam sistem di mana operasi atom 64-bit mahal.
  3. Kebebasan kunci: Reka bentuk SeqLock menghilangkan keperluan untuk kunci, menghasilkan akses serentak ke kaunter.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn