effizienter threadsicherer Singleton in C ++

Das übliche Muster für eine Singleton-Klasse ist etwa

static Foo &getInst()
{
  static Foo *inst = NULL;
  if(inst == NULL)
    inst = new Foo(...);
  return *inst;    
}

Ich verstehe jedoch, dass diese Lösung nicht thread-sicher ist, da 1) der Konstruktor von Foo möglicherweise mehrmals aufgerufen wird (was wichtig sein kann oder auch nicht) und 2) inst möglicherweise nicht vollständig erstellt wird, bevor es zu einem anderen zurückgegeben wird Faden

ine Lösung besteht darin, ein 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 das der richtige Weg, oder gibt es irgendwelche Fallstricke, auf die ich achten sollte? Gibt es zum Beispiel Probleme mit der statischen Initialisierungsreihenfolge, die auftreten können, d. H. Es wird immer garantiert, dass inst NULL ist, wenn getInst zum ersten Mal aufgerufen wird?

Antworten auf die Frage(9)

Ihre Antwort auf die Frage