Das übliche Muster für eine Singleton-Klasse ist so etwas wie
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
inst = new Foo(...);
return *inst;
}
Nach meinem Verständnis ist diese Lösung jedoch nicht threadsicher, da 1) der Konstruktor von Foo möglicherweise mehrmals aufgerufen wird (was möglicherweise von Bedeutung ist oder nicht) und 2) inst möglicherweise nicht vollständig erstellt wird, bevor er an einen anderen Thread zurückgegeben wird .
Eine Lösung besteht darin, einen Mutex um die gesamte Methode zu wickeln, aber dann zahle ich für den Synchronisationsaufwand, lange nachdem ich ihn tatsächlich benötige. Eine Alternative ist so etwas wie
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
{
pthread_mutex_lock(&mutex);
if(inst == NULL)
inst = new Foo(...);
pthread_mutex_unlock(&mutex);
}
return *inst;
}
Ist dies der richtige Weg, oder gibt es Fallstricke, die ich beachten sollte? Gibt es beispielsweise Probleme mit der statischen Initialisierungsreihenfolge, die auftreten können, dh ist inst immer garantiert NULL, wenn getInst zum ersten Mal aufgerufen wird?