Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Melaksanakan Singleton Tanpa Kunci dalam C 11 Tanpa Mutexes?

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

Patricia Arquette
Patricia Arquetteasal
2024-10-29 12:12:29458semak imbas

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>

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!

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