efficace thread-safe singleton en C++

Le schéma habituel pour une classe singleton est quelque chose comme

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

Cependant, c'est ma compréhension que cette solution n'est pas thread-safe, parce que 1) Foo constructeur qui peut être appelé plus d'une fois (ce qui peut ou ne peut pas d'importance) et 2) inst peut ne pas être entièrement construit avant, il est renvoyé à un autre thread.

Une solution consiste à envelopper un mutex autour de l'ensemble de la méthode, mais je suis payer pour la surcharge de la synchronisation de temps après j'ai réellement besoin. Une alternative est quelque chose comme

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;    
}

Est-ce la bonne façon de le faire, ou il y a des pièges, je devrais être au courant? Par exemple, il y a de l'électricité statique de l'ordre d'initialisation des problèmes qui peuvent se produire, c'est à dire inst toujours la garantie d'être NULLE la première fois getInst est appelé?

  • Mais vous n'avez pas le temps de trouver un exemple et de départ jusqu'à un vote serré? Je suis frais en ce moment.
  • double possible de stackoverflow.com/questions/6915/...
  • Non, l'interlocuteur ne pouvais évidemment pas être dérangé, alors pourquoi devrais-je? J'ai décidé d'abandonner downvoting et la clôture des dupes, et j'ai comme l'impression d'être l'un des rares à se soucier de garder la merde hors de soi. Et vous savez, la paresse se sent bien!
  • J'ai pris le temps de bien décrire mon problème, avec des extraits de code et une discussion de ce que je savais/avait essayé. Je suis désolé, je l'ai gaspillé votre temps avec "merde." 🙁
  • Si vous ne vous sentez pas comme la recherche de dupes et de clôture des questions, pourquoi la peine de pointage et de gagner un mauvais karma? C'est un très bon fil sur le sujet: stackoverflow.com/questions/6915. J'ai voté pour le fermer.
  • donc, I. Dispersion des réponses à travers des milliers de question est le meilleur moyen pour rendre difficile la recherche par la suite.
  • Double Possible de C++ modèle de conception Singleton

InformationsquelleAutor user168715 | 2010-04-04