El patrón habitual de una clase Singleton es algo así comoSingleton flujos seguros eficiente en C++
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
inst = new Foo(...);
return *inst;
}
Sin embargo, es mi entendimiento de que esta solución no es hilo de seguridad, ya que 1) el constructor de Foo podría llamarse más más de una vez (que puede o no importar) y 2) inst puede no estar completamente construido antes de que se devuelva a un hilo diferente.
Una solución es envolver un mutex alrededor de todo el método, pero luego estoy pagando por la sobrecarga de sincronización mucho después de que realmente lo necesite. Una alternativa es algo así 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;
}
Es esta la forma correcta de hacerlo, o hay cualquier escollo que debería tener en cuenta? Por ejemplo, ¿hay algún problema de orden de inicialización estática que pueda ocurrir, es decir, siempre se garantiza que el valor sea NULL la primera vez que se llama a getInst?
Pero ¿No tienes tiempo para encontrar un ejemplo y emitir un voto cercano? Estoy recién salido en este momento. – bmargulies
posible duplicado de http://stackoverflow.com/questions/6915/thread-safe-lazy-contruction-of-a-singleton-in-c – kennytm
@bmargulies No, obviamente no se pudo molestar al interrogador, entonces ¿por qué debería ¿YO? He decidido renunciar a la votación negativa y al cierre como una estafa, ya que parezco ser uno de los pocos que se molestan en mantener a raya a SO. Y sabes, la pereza se siente bien! –