effizientes threadsicheres Singleton in C ++

Dem üblichen 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;    
}

Aber es ist mein Verständnis, dass diese Lösung nicht thread-sicher, da 1) Foo Konstruktor könnte mehr als einmal aufgerufen werden (die möglicherweise oder möglicherweise nicht wichtig ist), und 2) inst möglicherweise nicht vollständig aufgebaut, bevor er wieder in einem anderen thread.

Eine Lösung ist, wickeln Sie einen mutex um die ganze Methode, aber dann werde ich die Zahlung für die Synchronisation overhead lange, nachdem ich es tatsächlich zu brauchen. 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, es zu tun, oder gibt es irgendwelche Fallstricke, die ich beachten sollte? Zum Beispiel, gibt es keine statische Initialisierung, um Probleme, die auftreten könnten, d.h. inst garantiert immer NULL sein, das erste mal getInst genannt wird?

Kommentar zu dem Problem
Aber Sie haben keine Zeit zu finden, ein Beispiel und tee eine enge Abstimmung? Ich bin frisch aus im moment. Kommentarautor: bmargulies
mögliche Duplikate von stackoverflow.com/questions/6915/... Kommentarautor: kennytm
@bmargulies Nein, der Fragesteller offensichtlich konnte nicht gestört, also warum sollte ich? Ich habe beschlossen, bis downvoting und Schließung dupes, wie ich scheinbar einer der wenigen die Mühe zu halten Scheiße aus SO. Und wissen Sie, Faulheit fühlt sich gut an! Kommentarautor:
Ich habe die Zeit nehmen, genau zu beschreiben mein problem, mit snippets und eine Diskussion, was ich kannte/hatte ich versucht. Tut mir Leid, ich habe Ihre Zeit verschwendet mit "Mist". 🙁 Kommentarautor: user168715
@sbi: so hat I. Streuenden Antworten, während Tausende von Fragen ist der beste Weg, um es schwer zu suchen, durch die Sie später auf. Kommentarautor: Matthieu M.

InformationsquelleAutor der Frage user168715 | 2010-04-04

Schreibe einen Kommentar