/ / Thread sicheres Singleton in C ++ nach gcc 4? - C ++, Multithreading, Gcc, statisch, Thread-Sicherheit

Sichere Singleton in C ++ nach gcc 4? - C ++, Multithreading, gcc, statisch, Thread-Sicherheit

Ich habe gehört, dass nach einer Version von gcc einfach etwas wie

static A* a = new A();
return a;

Ist für ein Singleton fadensicher, und man müsste von da an nichts angepasstes sagen http://locklessinc.com/articles/singleton_pattern/ nicht mehr...

Hat jemand eine spezifische Referenz oder einen Link, wo ich darüber lesen kann?

Antworten:

3 für die Antwort № 1

Abschnitt 6.7 des Normentwurfs (n3337.pdf) Ziffer 4:

Die Nullinitialisierung (8.5) aller Blockbereichsvariablen mit statischer Speicherdauer (3.7.1) oder Threadspeicher Dauer (3.7.2) wird ausgeführt, bevor eine andere Initialisierung erfolgt. Konstante Initialisierung (3.6.2) von a Block-Entity mit statischer Speicherdauer, falls zutreffend, wird ausgeführt, bevor der Block zum ersten Mal eingegeben wird. Eine Implementierung kann eine frühe Initialisierung anderer Blockbereichsvariablen mit statisch oder durchführen Thread-Speicherdauer unter den gleichen Bedingungen, unter denen eine Implementierung statisch initialisiert werden darf eine Variable mit statischer oder Thread-Speicherdauer im Namespace-Bereich (3.6.2). Ansonsten ist eine solche Variable initialisiert das erste Mal, wenn die Kontrolle ihre Deklaration durchläuft; Eine solche Variable gilt als initialisiert der Abschluss seiner Initialisierung. Wenn die Initialisierung durch Auslösen einer Ausnahme beendet wird, erfolgt die Initialisierung ist nicht vollständig, daher wird es erneut versucht, wenn die Steuerung das nächste Mal die Deklaration eingibt. Wenn die Kontrolle eingeht die Deklaration gleichzeitig, während die Variable initialisiert wird, muss die gleichzeitige Ausführung warten Abschluss der Initialisierung.88 Wenn die Steuerung die Deklaration rekursiv wiedergibt, während die Variable gerade ist initialisiert ist das Verhalten undefiniert.


1 für die Antwort № 2

GCC folgt dem herstellerübergreifenden Itanium C ++ ABI. Die relevanten Abschnitte, die die Thread-sichere Initialisierung der funktionslokalen Statik abdecken, sind 2.8 Initialisierungsschutzvariablen und 3.3.2 Einmalige Konstruktions-API, was sagt:

Eine Implementierung, die nicht antizipiertDas Unterstützen von Multithreading kann einfach das erste Byte (d. h. das Byte mit der niedrigsten Adresse) dieser Schutzvariablen prüfen, wenn und nur dann, wenn sein Wert Null ist, initialisieren und dann auf einen Wert ungleich Null setzen.

Eine Implementierung beabsichtigt jedoch zu unterstützenDie automatische Thread-sichere einmalige Initialisierung (im Gegensatz zur expliziten Benutzersteuerung für die Thread-Sicherheit) kann folgende API-Funktionen verwenden: ...

Im frühen GCC gab es einige FehlerImplementierung dieser API, ich denke, dass sie alle behoben sind und ab GCC Version 4.3 korrekt funktioniert (möglicherweise früher, ich erinnere mich nicht mehr daran und finde im Moment keine Referenz.)

Jedoch, Singleton ist schlecht, schlechtes Muster, verwende es nicht!