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?