Comment puis-je créer un motif singleton thread-safe dans Windows?

J'ai lu à propos de "thread-safe" singleton modèles ici:

http://en.wikipedia.org/wiki/Singleton_pattern#C.2B.2B_.28using_pthreads.29

Et il dit au fond que la seule façon est d'utiliser pthread_once - ce qui n'est pas disponible sur Windows.

Est que le seulement moyen de garantir thread-safe initialisation?

J'ai lu ce fil de discussion sur DONC:

Thread-safe paresseux de la construction d'un singleton en C++

Et semble faire allusion à une atomique au niveau de l'OS de swap et de la fonction de comparaison, ce qui je suppose sur Windows:

http://msdn.microsoft.com/en-us/library/ms683568.aspx

Cela peut-il faire ce que je veux?

Edit: je voudrais paresseux de l'initialisation et de là à être une instance de la classe.

Quelqu'un sur un autre site mentionné à l'aide d'un mondial à l'intérieur d'un espace de noms (et il a décrit un singleton comme un anti-modèle) - comment peut-il être un "anti-modèle"?

Accepté Réponse:
J'ai accepté Josh réponse que je suis à l'aide de Visual Studio 2008 - NB: Pour les futurs lecteurs, si vous n'utilisez pas ce compilateur (ou 2005) - N'utilisez pas la accepté de répondre!!

Edit:
Le code fonctionne bien sauf le retour de l'instruction, j'obtiens une erreur:
error C2440: 'return' : impossible de convertir de 'volatile Singleton *' Singleton *'.
Dois-je modifier la valeur de retour d'être volatile Singleton *?

Edit: Apparemment const_cast<> supprimer de la volatilité de la qualification. Encore merci à Josh.

source d'informationauteur Mark Ingram