Bagaimana untuk Melaksanakan Singleton Berbilang Benang dalam C 11 Tanpa Mutexes?

Patricia Arquette
Lepaskan: 2024-11-03 13:42:30
asal
675 orang telah melayarinya

How to Implement a Multithreaded Singleton in C  11 Without Mutexes?

Melaksanakan Singleton Multithreaded dalam C 11 Tanpa Mutexes

Dengan pengenalan keupayaan multithreading dalam C 11, persoalan timbul tentang bagaimana untuk melaksanakan singleton tanpa menggunakan mutex untuk pengoptimuman prestasi. Pendekatan yang dicadangkan melibatkan penggunaan pembolehubah atom dan fungsi std::atomic_compare_exchange_strong():

<code class="cpp">class Singleton
{
public:
    static bool isInitialized() { return (flag == 2); }
    static bool initizalize(const string& name_)
    {
        if (flag == 2)
            return false;
        if (flag == 1)
            return false;
        int exp = 0;
        int desr = 1;
        bool willInitialize = std::atomic_compare_exchange_strong(&flag, &exp, desr);
        if (!willInitialize)
        {
            cout << "Somebody else CASed at aprox same time" << endl;
            return false;
        }
        else
        {
            initialize_impl(name_);
            assert(flag == 1);
            flag = 2;
            return true;
        }
    }
    static void clear()
    {
        name.clear();
        flag = 0;
    }

private:
    static void initialize_impl(const string& name_) { name = name_; }
    static atomic<int> flag;
    static string name;
};</code>
Salin selepas log masuk

Pembolehubah atom dan fungsi std::atomic_compare_exchange_strong() memastikan keselamatan benang tanpa memperkenalkan penyegerakan di atas kepala. Walau bagaimanapun, pendekatan ini masih memerlukan pengendalian yang berhati-hati untuk mengelakkan perlumbaan data dan memastikan permulaan yang betul.

Piawaian C 11 Menguatkuasakan Keselamatan Permulaan

Menariknya, piawaian C 11 menghapuskan keperluan untuk penguncian manual dalam senario tertentu. Coretan kod berikut memanfaatkan gelagat ini:

<code class="cpp">static Singleton& get() {
  static Singleton instance;
  return instance;
}</code>
Salin selepas log masuk

Perlaksanaan serentak yang cuba memulakan tika pembolehubah statik secara tersirat akan menunggu siapnya, mengurangkan kemungkinan keadaan perlumbaan.

Singleton Anti- Corak

Walaupun pendekatan di atas menyediakan penyelesaian untuk pelaksanaan singleton berbilang benang, perlu diingat bahawa penggunaan singleton secara amnya tidak digalakkan. Mereka boleh memperkenalkan gandingan, kebergantungan keadaan, dan merumitkan ujian unit. Corak reka bentuk alternatif selalunya lebih disukai untuk mengurus sumber dan kebergantungan yang dikongsi.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Singleton Berbilang Benang 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