/Zc:threadSafeInit (потокобезопасная локальная статичная инициализация)

Параметр компилятора /Zc:thread Сейф Init сообщает компилятору инициализировать статические локальные (функции область) переменные в потокобезопасном способе, устраняя необходимость ручной синхронизации. Только инициализация является потокобезопасной. Использование и изменение статических локальных переменных несколькими потоками по-прежнему должно быть синхронизировано вручную. Этот параметр доступен начиная с Visual Studio 2015. По умолчанию Visual Studio включает этот параметр.

Синтаксис

/Zc:thread Сейф Init[-]

Замечания

В стандарте C++11 блокировка область переменных со статическим или потоком длительности хранилища потоков должна быть инициализирована до завершения любой другой инициализации. Инициализация возникает при первом прохождении элемента управления через объявление переменной. Если исключение возникает во время инициализации, переменная считается неинициализируемой, а инициализация выполняется повторно при следующем переходе элемента управления через объявление. Если элемент управления входит в объявление одновременно с инициализацией, одновременные блоки выполнения при завершении инициализации. Поведение не определено, если элемент управления повторно вводит объявление рекурсивно во время инициализации. По умолчанию Visual Studio, начиная с Visual Studio 2015, реализует это стандартное поведение. Это поведение можно явно указать, задав параметр компилятора /Zc:thread Сейф Init.

Параметр компилятора /Zc:thread Сейф Init включен по умолчанию. Параметр /permissive- не влияет на /Zc:thread Сейф Init.

Потокобезопасная инициализация статических локальных переменных зависит от кода, реализованного в универсальной библиотеке времени выполнения C (UCRT). Чтобы избежать зависимости от UCRT или сохранить непоточное поведение инициализации версий Visual Studio до Visual Studio 2015, используйте параметр /Zc:thread Сейф Init-. Если вы знаете, что потокобезопасность не требуется, используйте этот параметр для создания немного меньшего, более быстрого кода вокруг статических локальных объявлений.

Потокобезопасные статические локальные переменные используют локальное хранилище потока (TLS) для обеспечения эффективного выполнения, когда статический уже инициализирован. Реализация этой функции зависит от функций поддержки операционной системы Windows в Windows Vista и более поздних операционных системах. Windows XP, Windows Server 2003 и старые операционные системы не поддерживают эту поддержку, поэтому они не получают преимущества эффективности. Эти операционные системы также имеют меньшее ограничение на количество разделов TLS, которые можно загрузить. Превышение предела раздела TLS может привести к сбою. Если это проблема в коде, особенно в коде, который должен выполняться в старых операционных системах, используйте /Zc:thread Сейф Init- для отключения кода инициализации, безопасного для потоков.

Дополнительные сведения о вопросах соответствия в Visual C++ см. в статье Nonstandard Behavior.

Установка данного параметра компилятора в среде разработки Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

  2. В раскрывающемся меню "Конфигурации" выберите "Все конфигурации".

  3. Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.

  4. Измените свойство "Дополнительные параметры", чтобы включить /Zc:thread Сейф Init или /Zc:thread Сейф Init- и нажмите кнопку "ОК".

См. также

Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC
/Zc (соответствие)