Meyers' Singleton: Bewertung und Verbesserung der Thread-Sicherheit
Die Meyers-Implementierung des Singleton-Musters nutzt eine verzögerte Initialisierung, die Thread-Sicherheit bleibt jedoch erhalten ein Anliegen. Dieser Artikel befasst sich mit den Feinheiten der Thread-Sicherheit im angegebenen Code:
static Singleton& instance() { static Singleton s; return s; }
In C 11 und darüber hinaus
In C 11 erfolgt die verzögerte Initialisierung globaler Objekte Thread-sicher aufgrund der Garantie des Standards: Die gleichzeitige Initialisierung führt dazu, dass bis zu ihrem Abschluss gewartet wird. Sowohl GCC als auch Visual Studio unterstützen diese Funktion.
Daher ist die Singleton-Implementierung von Meyers in einer Umgebung mit C 11 oder höher threadsicher.
In C 03 und früher
In C 03 und früher ist der bereitgestellte Code nicht threadsicher. Wie Meyers in seinem Artikel beschreibt, können doppelt überprüfte Sperrmuster auf bestimmten Architekturen anfällig für Race Conditions sein. Um in diesem Zusammenhang Thread-Sicherheit zu erreichen, wird eine vollständige Sperre um die Instanziierungsmethode empfohlen.
Code für C 03 Thread-Sicherheit
Hier ist eine Modifikation des Codes für C 03 Thread-Sicherheit:
static Singleton*& instance() { static Singleton* s = nullptr; static std::mutex s_mutex; std::lock_guard<std::mutex> guard(s_mutex); if (!s) s = new Singleton; return s; }
Diese Implementierung verwendet einen Mutex, um den Zugriff während der Initialisierung zu synchronisieren und so die Thread-Sicherheit zu gewährleisten.
Das obige ist der detaillierte Inhalt vonIst Meyers' Singleton Thread-sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!