Bagaimana untuk Melaksanakan Singleton Tanpa Kunci dalam C 11 Tanpa Mutexes?

Patricia Arquette
Lepaskan: 2024-10-29 12:12:29
asal
375 orang telah melayarinya

How to Implement a Lock-Free Singleton in C  11 Without Mutexes?

Melaksanakan Singleton Multithread-Safe dalam C 11 Tanpa Mutexes

Dalam C 11, multithreading memperkenalkan kebimbangan baharu untuk melaksanakan kelas singleton. Walaupun penggunaan mutex boleh menjamin keselamatan benang, ia mungkin menjejaskan prestasi. Artikel ini meneroka pendekatan alternatif untuk mencipta singleton tanpa kunci tanpa menggunakan mutex.

Pernyataan Masalah:

Bagaimanakah kita boleh melaksanakan singleton yang dimulakan malas dalam C 11 tanpa menggunakan mutexes atas sebab prestasi?

Penyelesaian Cadangan:

atomic_compare_exchange_strong:

Untuk mencapai permulaan tanpa kunci, kami boleh memanfaatkan fungsi std::atomic_compare_exchange_strong. Operasi atom ini membandingkan nilai jangkaan pembolehubah atom std::(bendera) dengan nilai yang dikehendaki (desr) dan, jika ia sepadan, mengemas kini pembolehubah kepada desr.

Proses Permulaan:

Dalam fungsi permulaan, kami melakukan langkah berikut:

  1. Tetapkan bendera kepada 1 untuk menunjukkan bahawa permulaan sedang berjalan.
  2. Gunakan atomic_compare_exchange_strong untuk menyemak sama ada bendera ialah 1. Jika ya, kami meneruskan dengan pemula.
  3. Jika CAS berjaya, bendera ditetapkan kepada 2 untuk menunjukkan pemula yang berjaya.
  4. Jika CAS gagal, urutan lain telah pun dimulakan singleton.

Keselamatan Benang:

Pelaksanaan benang secara serentak dikendalikan oleh langkah-langkah berikut:

  • Jika bendera sudah 2, permulaan telah pun selesai.
  • Jika bendera ialah 0, kami cuba untuk memulakannya menggunakan atomic_compare_exchange_strong.
  • Jika bendera ialah 1, urutan lain sedang dimulakan, jadi arus benang menanti.

Contoh Pelaksanaan:

<code class="cpp">class Singleton
{
public:
    static Singleton& get()
    {
        static Singleton instance;
        return instance;
    }

    static bool initialize(const string& name);
};</code>
Salin selepas log masuk

Kesimpulan:

Dengan memanfaatkan fungsi atomic_compare_exchange_strong, kita boleh melaksanakan singleton selamat berbilang benang dalam C 11 tanpa bergantung pada mutex. Pendekatan ini memastikan bahawa hanya satu utas akan berjaya memulakan singleton pada bila-bila masa.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Singleton Tanpa Kunci dalam C 11 Tanpa Mutexes?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!