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

Bagaimana untuk Melaksanakan Pembilang Atom 64-bit Hanya Menggunakan Pembolehubah Atom 32-bit?

Mary-Kate Olsen
Lepaskan: 2024-12-11 17:38:19
asal
716 orang telah melayarinya

How to Implement a 64-bit Atomic Counter Using Only 32-bit Atomic Variables?

Melaksanakan Pembilang Atom 64-bit dengan Pembolehubah Atom 32-bit

Soalan:

Reka bentuk dan laksanakan pembilang atom 64-bit menggunakan atom 32-bit pembolehubah. Kaunter mempunyai seorang penulis (pengendali isyarat) dan berbilang pembaca.

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);
    }
};
Salin selepas log masuk

Jawapan:

Kod yang disediakan ialah pelaksanaan yang betul bagi pembilang atom 64-bit menggunakan pembolehubah atom 32-bit. Ia menggunakan teknik yang dikenali sebagai SeqLock, yang menggunakan kiraan penjanaan untuk mengekalkan konsistensi bahagian tinggi dan rendah pembilang.

Operasi baca menggunakan gelung untuk memperoleh keadaan pembilang yang betul semasa mengendalikan keadaan perlumbaan yang berpotensi antara pembaca dan penulis. Operasi tulis menambah kedua-dua bahagian tinggi dan rendah pembilang secara atom, menggunakan susunan memori untuk memastikan kelakuan yang betul.

Pelaksanaan yang Diperbaiki:

Sementara kod yang disediakan adalah betul , ia boleh dipertingkatkan untuk prestasi dan kecekapan yang lebih baik:

  • Daripada menggunakan operasi RMW atom untuk kaunter muatan, ia boleh digantikan dengan muatan biasa dan stor untuk mengelakkan overhed yang tidak perlu.
  • Kaunter jujukan juga boleh diselenggara dengan muatan dan stor biasa, kerana ia hanya perlu meningkat secara monoton dan tidak dikemas kini secara atom.

Reka Bentuk Alternatif:

Reka bentuk alternatif yang menghapuskan keperluan untuk operasi RMW atom sama sekali ialah menggunakan gabungan uint64_t yang tidak menentu dan std::atomic pembolehubah. Bahagian yang tidak menentu boleh digunakan untuk membaca dan menulis nilai, manakala pembolehubah atom boleh digunakan untuk mengemas kini pembilang jujukan. Pendekatan ini menyediakan jaminan yang diperlukan untuk tingkah laku yang betul sambil mengoptimumkan prestasi.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pembilang Atom 64-bit Hanya Menggunakan Pembolehubah Atom 32-bit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan