Heim > Backend-Entwicklung > C++ > Wie implementiert man einen Multithread-Singleton in C 11 ohne Mutexe?

Wie implementiert man einen Multithread-Singleton in C 11 ohne Mutexe?

Patricia Arquette
Freigeben: 2024-11-03 13:42:30
Original
734 Leute haben es durchsucht

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

Implementierung von Multithread-Singleton in C 11 ohne Mutexe

Mit der Einführung von Multithreading-Funktionen in C 11 stellt sich die Frage, wie Singletons implementiert werden ohne Mutexe zur Leistungsoptimierung zu verwenden. Ein vorgeschlagener Ansatz beinhaltet die Verwendung atomarer Variablen und der Funktion 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>
Nach dem Login kopieren

Atomvariablen und der Funktion std::atomic_compare_exchange_strong() gewährleisten Thread-Sicherheit, ohne einen Mehraufwand für die Thread-Synchronisierung zu verursachen. Dieser Ansatz erfordert jedoch immer noch eine sorgfältige Handhabung, um Datenwettläufe zu verhindern und eine ordnungsgemäße Initialisierung sicherzustellen.

Der C 11-Standard erzwingt die Initialisierungssicherheit.

Interessanterweise macht der C 11-Standard dies überflüssig manuelles Sperren in bestimmten Szenarien. Der folgende Codeausschnitt nutzt dieses Verhalten aus:

<code class="cpp">static Singleton& get() {
  static Singleton instance;
  return instance;
}</code>
Nach dem Login kopieren

Die gleichzeitige Ausführung, die versucht, die statische Variableninstanz zu initialisieren, wartet implizit auf deren Abschluss, wodurch potenzielle Race-Bedingungen reduziert werden.

Singleton Anti- Muster

Während die oben genannten Ansätze Lösungen für die Multithread-Singleton-Implementierung bieten, ist es erwähnenswert, dass von der Verwendung von Singletons im Allgemeinen abgeraten wird. Sie können Kopplungen und Zustandsabhängigkeiten einführen und Unit-Tests erschweren. Alternative Entwurfsmuster sind oft für die Verwaltung gemeinsamer Ressourcen und Abhängigkeiten vorzuziehen.

Das obige ist der detaillierte Inhalt vonWie implementiert man einen Multithread-Singleton in C 11 ohne Mutexe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage