эффективный потокобезопасный синглтон в C ++

Обычный образец для одноэлементного класса - что-то вроде

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

Тем не менее, я понимаю, что это решение не является потокобезопасным, поскольку 1) конструктор Foo может вызываться более одного раза (что может иметь или не иметь значения), и 2) inst не может быть полностью создан до того, как он будет возвращен в другой поток. ,

Одно из решений состоит в том, чтобы обернуть мьютекс вокруг всего метода, но потом я плачу за синхронизацию еще долго после того, как она мне действительно понадобится. Альтернатива что-то вроде

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

Это правильный способ сделать это, или есть какие-то подводные камни, о которых я должен знать? Например, могут ли возникнуть проблемы с порядком статической инициализации, т. Е. Всегда ли гарантируется, что inst всегда будет равен NULL при первом вызове getInst?