Share via


/Zc:threadSafeInit (Inicialização estática local thread-safe)

A opção do compilador /Zc:threadSafeInit informa ao compilador para inicializar variáveis locais estáticas (escopo de função) de maneira thread-safe, eliminando a necessidade de sincronização manual. Somente a inicialização é thread-safe. O uso e a modificação de variáveis locais estáticas por vários threads ainda devem ser sincronizados manualmente. Essa opção está disponível a partir do Visual Studio 2015. Por padrão, o Visual Studio habilita essa opção.

Sintaxe

/Zc:threadSafeInit[-]

Comentários

No padrão C++11, as variáveis de escopo de bloco com duração de armazenamento estático ou de thread devem ser inicializadas em zero antes que qualquer outra inicialização ocorra. A inicialização ocorre quando o controle passa pela primeira vez pela declaração da variável. Se uma exceção for gerada durante a inicialização, a variável será considerada não inicializada e a inicialização será tentada novamente na próxima vez que o controle passar pela declaração. Se o controle inserir a declaração simultaneamente com a inicialização, a execução simultânea será bloqueada enquanto a inicialização for realizada. O comportamento será indefinido se o controle inserir novamente a declaração recursivamente durante a inicialização. Por padrão, o Visual Studio, a partir do Visual Studio 2015, implementa esse comportamento padrão. Esse comportamento pode ser especificado explicitamente definindo a opção do compilador /Zc:threadSafeInit.

A opção do compilador /Zc:threadSafeInit fica ativada por padrão. A opção /permissive- não afeta a /Zc:threadSafeInit.

A inicialização thread-safe de variáveis locais estáticas depende do código implementado na UCRT (biblioteca de runtime do Universal C). Para evitar uma dependência da UCRT ou preservar o comportamento de inicialização não thread-safe das versões do Visual Studio anteriores ao Visual Studio 2015, use a opção /Zc:threadSafeInit-. Se você souber que a segurança de thread não é necessária, use essa opção para gerar um código um pouco menor e mais rápido em relação às declarações locais estáticas.

As variáveis locais estáticas thread-safe usam o TLS (armazenamento local de thread) internamente para fornecer uma execução eficiente quando a estática já tiver sido inicializada. A implementação desse recurso depende das funções de suporte do sistema operacional Windows no Windows Vista e em sistemas operacionais posteriores. O Windows XP, o Windows Server 2003 e sistemas operacionais mais antigos não têm esse suporte, portanto, eles não obtêm a vantagem de eficiência. Esses sistemas operacionais também têm um limite menor no número de seções de TLS que podem ser carregadas. Exceder o limite de seção ee TLS poderá causar uma falha. Se esse for um problema em seu código, especialmente no código que deva ser executado em sistemas operacionais mais antigos, use /Zc:threadSafeInit- para desabilitar o código de inicialização thread-safe.

Para obter mais informações sobre problemas de conformidade no Visual C++, confira Comportamento fora do padrão.

Para definir esta opção do compilador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para obter detalhes, confira Definir as propriedades de build e do compilador do C++ no Visual Studio.

  2. No menu suspenso Configurações, escolha Todas as Configurações.

  3. Selecione a página de propriedades Propriedades de Configuração>C/C++>Linha de Comando.

  4. Modifique a propriedade Opções Adicionais para incluir /Zc:threadSafeInit ou /Zc:threadSafeInit- e escolha OK.

Confira também

Opções do compilador MSVC
Sintaxe da linha de comando do compilador MSVC
/Zc (conformidade)