Est-ce membre statique C de thread-safe d'initialisation variable?
-
21-09-2019 - |
Question
Selon les ressources suivantes, en C ++ (spécialement Visual C ++) SCOPED initialisation variable statique est pas sûre. Mais, les variables statiques globales sont en sécurité.
variables statiques Thread-safe sans mutexing
http://blogs.msdn.com/oldnewthing/ archives / 2004/03/08 / 85901.aspx
Alors, est-code suivant avec thread-safe variable de membre statique?
class TestClass
{
public:
static MyClass m_instance;
}
Myclass TestClass::m_instance;
Merci d'avance!
La solution
Il est plus une question de variables statiques scope fonction-contre tous les autres types de variable statique, plutôt que par rapport à scope GLOBALS.
Tous les non-fonction de portée variables statiques sont construites, alors qu'il n'y a qu'un seul fil actif avant main (). variables statiques fonction de portée sont réalisées la première fois leur fonction contenant est appelée. La norme est muet sur la question de savoir comment au niveau de statics fonction sont construites lorsque la fonction est appelée sur plusieurs threads. Cependant, chaque mise en œuvre que j'ai travaillé avec utilise un verrou autour du constructeur (avec un drapeau deux fois vérifié) pour garantir la sécurité-fil.
Autres conseils
Oui (*). Lorsque globaux sont initialisés statics, il n'y a qu'un seul fil autour et tous les constructeurs sont appelés à ce sujet. Ce n'est pas vrai pour les fonctions de statique, cependant.
(*) On peut éventuellement faire statics pas thread global de sécurité en créant des fils dans certains des constructeurs et la planification des étapes d'initialisation sur ces fils. Dans ce cas, les règles habituelles de sécurité thread apply.