Поделиться через


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

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

Синтаксис

/Zc:threadSafeInit[-]

Замечания

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

Параметр компилятора /Zc:threadSafeInit включен по умолчанию. Параметр /permissive- не влияет на /Zc:threadSafeInit.

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

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

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

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

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

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

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

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

См. также

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