/Zc:threadSafeInit (Threadsichere lokale statische Initialisierung)

Die Compileroption "/Zc:thread Tresor Init" weist den Compiler an, statische lokale Variablen (Funktionsbereich) auf threadsichere Weise zu initialisieren, sodass keine manuelle Synchronisierung erforderlich ist. Nur die Initialisierung ist threadsicher. Die Verwendung und Änderung statischer lokaler Variablen durch mehrere Threads muss weiterhin manuell synchronisiert werden. Diese Option ist ab Visual Studio 2015 verfügbar. Standardmäßig aktiviert Visual Studio diese Option.

Syntax

/Zc:thread Tresor Init[-]

Hinweise

Im C++11-Standard müssen Blockbereichsvariablen mit statischer oder Threadspeicherdauer null initialisiert werden, bevor eine andere Initialisierung stattfindet. Initialisierung tritt auf, wenn das Steuerelement zuerst die Deklaration der Variablen durchgibt. Wenn während der Initialisierung eine Ausnahme ausgelöst wird, wird die Variable als nicht initialisiert betrachtet, und die Initialisierung wird beim nächsten Durchlaufen der Deklaration erneut versucht. Wenn das Steuerelement die Deklaration gleichzeitig mit der Initialisierung eingibt, werden die gleichzeitigen Ausführungsblöcke während der Initialisierung abgeschlossen. Das Verhalten ist nicht definiert, wenn das Steuerelement die Deklaration während der Initialisierung rekursiv eingibt. Standardmäßig implementiert Visual Studio ab Visual Studio 2015 dieses Standardverhalten. Dieses Verhalten kann explizit durch Festlegen der Compileroption /Zc:thread Tresor Init angegeben werden.

Die Compileroption "/Zc:thread Tresor Init" ist standardmäßig aktiviert. Die Option "/permissive" wirkt sich nicht auf /Zc:thread Tresor Init aus.

Threadsichere Initialisierung statischer lokaler Variablen basiert auf Code, der in der universellen C-Laufzeitbibliothek (UCRT) implementiert ist. Verwenden Sie die Option "/Zc:thread Tresor Init-", um eine Abhängigkeit von der UCRT zu vermeiden oder das nicht threadsichere Initialisierungsverhalten von Versionen von Visual Studio vor Visual Studio 2015 beizubehalten. Wenn Sie wissen, dass threadsicherheit nicht erforderlich ist, verwenden Sie diese Option, um etwas kleineren, schnelleren Code um statische lokale Deklarationen zu generieren.

Threadsichere statische lokale Variablen verwenden thread-local storage (TLS) intern, um eine effiziente Ausführung zu ermöglichen, wenn die statische Datei bereits initialisiert wurde. Die Implementierung dieses Features basiert auf Windows-Betriebssystemunterstützungsfunktionen in Windows Vista und höheren Betriebssystemen. Windows XP, Windows Server 2003 und ältere Betriebssysteme haben diese Unterstützung nicht, sodass sie nicht den Effizienzvorteil erhalten. Diese Betriebssysteme haben auch einen niedrigeren Grenzwert für die Anzahl der TLS-Abschnitte, die geladen werden können. Das Überschreiten des TLS-Abschnittslimits kann zu einem Absturz führen. Wenn dies ein Problem in Ihrem Code ist, insbesondere im Code, der auf älteren Betriebssystemen ausgeführt werden muss, verwenden Sie "/Zc:thread Tresor Init", um den threadsicheren Initialisierungscode zu deaktivieren.

Weitere Informationen über Konformitätsprobleme in Visual C++ finden Sie unter Nonstandard Behavior.

So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).

  2. Wählen Sie im Dropdownmenü "Konfigurationen" die Option "Alle Konfigurationen" aus.

  3. Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.

  4. Ändern Sie die Eigenschaft "Zusätzliche Optionen", um "/Zc:thread Tresor Init" oder "/Zc:thread Tresor Init" einzuschließen, und wählen Sie dann "OK" aus.

Siehe auch

MSVC-Compileroptionen
Syntax für die MSVC-Compilerbefehlszeile
/Zc (Übereinstimmung)