/Zc:threadSafeInit (Bezpieczne wątkowo lokalne statyczne inicjowanie)

/Zc:thread Sejf Init opcja kompilatora nakazuje kompilatorowi inicjowanie zmiennych statycznych lokalnych (zakres funkcji) w bezpieczny wątkowo sposób, eliminując konieczność ręcznej synchronizacji. Tylko inicjowanie jest bezpieczne wątkowo. Używanie i modyfikowanie statycznych zmiennych lokalnych przez wiele wątków musi być nadal synchronizowane ręcznie. Ta opcja jest dostępna od programu Visual Studio 2015. Domyślnie program Visual Studio włącza tę opcję.

Składnia

/Zc:thread Sejf Init[-]

Uwagi

W standardzie C++11 zmienne zakresu bloku z czasem trwania magazynu statycznego lub wątkowego muszą być zerowe, zanim zostanie zainicjowana inna inicjalizacja. Inicjowanie występuje, gdy kontrolka najpierw przechodzi przez deklarację zmiennej. Jeśli podczas inicjowania zgłaszany jest wyjątek, zmienna jest uznawana za niezainicjowaną, a inicjowanie zostanie ponowione przy następnej próbie przejścia przez deklarację . Jeśli kontrolka wprowadza deklarację współbieżnie z inicjowaniem, równoczesne bloki wykonywania podczas inicjowania jest ukończone. Zachowanie jest niezdefiniowane, jeśli kontrolka ponownie wprowadza deklarację rekursywnie podczas inicjowania. Domyślnie program Visual Studio rozpoczynający się w programie Visual Studio 2015 implementuje to standardowe zachowanie. To zachowanie może być jawnie określone przez ustawienie opcji /Zc:thread Sejf Init kompilatora.

Opcja /Zc:thread Sejf Init kompilatora jest domyślnie włączona. Opcja /permissive- nie ma wpływu na /Zc:thread Sejf Init.

Bezpieczne wątkowo inicjowanie statycznych zmiennych lokalnych opiera się na kodzie zaimplementowanym w bibliotece uniwersalnego czasu wykonywania języka C (UCRT). Aby uniknąć zależności od narzędzia UCRT lub zachowania zachowania inicjacji niezwiązanej z wątkiem wersji programu Visual Studio przed programem Visual Studio 2015, użyj opcji /Zc:thread Sejf Init-. Jeśli wiesz, że bezpieczeństwo wątków nie jest wymagane, użyj tej opcji, aby wygenerować nieco mniejszy, szybszy kod wokół statycznych deklaracji lokalnych.

Statyczne zmienne statyczne bezpieczne wątkowo używają magazynu lokalnego wątku (TLS) wewnętrznie w celu zapewnienia wydajnego wykonywania, gdy statyczny został już zainicjowany. Implementacja tej funkcji opiera się na funkcjach obsługi systemu operacyjnego Windows w systemie Windows Vista i nowszych systemach operacyjnych. System Windows XP, Windows Server 2003 i starsze systemy operacyjne nie mają tej obsługi, więc nie uzyskują korzyści z wydajności. Te systemy operacyjne mają również niższy limit liczby sekcji protokołu TLS, które można załadować. Przekroczenie limitu sekcji protokołu TLS może spowodować awarię. Jeśli jest to problem w kodzie, zwłaszcza w kodzie, który musi działać w starszych systemach operacyjnych, użyj /Zc:thread Sejf Init- w celu wyłączenia kodu inicjowania bezpiecznego wątku.

Aby uzyskać więcej informacji na temat problemów ze zgodnością w programie Visual C++, zobacz Zachowanie niezgodne.

Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio

  1. Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).

  2. Z menu rozwijanego Konfiguracje wybierz pozycję Wszystkie konfiguracje.

  3. Wybierz stronę Właściwości>konfiguracji C/C++>Wiersza polecenia.

  4. Zmodyfikuj właściwość Opcje dodatkowe, aby uwzględnić /Zc:thread Sejf Init lub /Zc:thread Sejf Init-, a następnie wybierz przycisk OK.

Zobacz też

Opcje kompilatora MSVC
Składnia wiersza polecenia kompilatora MSVC
/Zc (Zgodność)