singleton eficiente de thread-safe em C ++

O padrão usual para uma classe singleton é algo como

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

No entanto, entendo que esta solução não é segura para threads, pois 1) o construtor de Foo pode ser chamado mais de uma vez (o que pode ou não interessar) e 2) inst não pode ser totalmente construído antes de retornar para um thread diferente .

Uma solução é envolver um mutex em todo o método, mas depois pagarei a sobrecarga da sincronização muito depois de realmente precisar. Uma alternativa é algo como

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

É este o caminho certo para fazê-lo, ou existem armadilhas das quais devo estar ciente? Por exemplo, há algum problema de ordem de inicialização estática que possa ocorrer, ou seja, inst sempre é NULL na primeira vez que getInst é chamado?

questionAnswers(9)

yourAnswerToTheQuestion