É o C++ variável de membro estático de inicialização da thread-safe?
-
21-09-2019 - |
Pergunta
De acordo com os seguintes recursos, em C++(Especialmente o Visual C++) escopo estático de inicialização de variável não é thread-safe.Mas, variáveis globais estáticas são seguros.
Thread-safe variáveis estáticas sem mutexing?
http://blogs.msdn.com/oldnewthing/archive/2004/03/08/85901.aspx
Assim, é de código a seguir com a variável de membro estático thread-safe?
class TestClass
{
public:
static MyClass m_instance;
}
Myclass TestClass::m_instance;
Obrigado antecipadamente!
Solução
É mais uma questão de função de escopo de variáveis estáticas versusqualquer outro tipo de variável estática, ao invés de incluir no escopo vs.globals.
Tudo de função não-escopo de variáveis estáticas são construídos antes de main(), enquanto que há apenas uma thread ativa.Funções estáticas são construídos a primeira vez que os contêm função é chamada.A norma é omissa sobre a questão de como a função de nível de estática são construídos quando a função é chamada em vários segmentos.No entanto, cada implementação trabalhei com usa um bloqueio em torno do construtor (com uma, duas vezes-verificada bandeira) para garantir segurança de segmentos.
Outras dicas
Sim(*).Quando globais estáticas são inicializados, existe apenas um segmento ao redor e todos os construtores são chamados sobre ele.Isso não é verdade para a função estática, embora.
(*) Pode-se, possivelmente, tornar global estática, não é thread-safe através da criação de threads em alguns dos construtores e agendamento de alguns inicialização fases em que esses segmentos.Neste caso usual thread regras de segurança aplicáveis.