Il modello usuale per una classe Singleton è qualcosa di simileefficiente Singleton thread-safe in C++
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
inst = new Foo(...);
return *inst;
}
Tuttavia, è la mia comprensione che questa soluzione non è thread-safe, dal momento che 1) il costruttore di Foo potrebbe essere chiamato più di una volta (che può o non può importare) e 2) inst può non essere completamente costruito prima che venga restituito a un thread diverso.
Una soluzione è racchiudere un mutex attorno all'intero metodo, ma poi sto pagando il sovraccarico della sincronizzazione per molto tempo dopo che ne ho effettivamente bisogno. Un'alternativa è qualcosa di simile
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;
}
È questo il modo giusto per farlo, o ci sono delle insidie che dovrei essere a conoscenza? Ad esempio, ci sono problemi di ordine di inizializzazione statici che potrebbero verificarsi, vale a dire inst è sempre garantito che sia NULL la prima volta che viene chiamato getInst?
Ma voi non hai tempo per trovare un esempio e iniziare un voto ravvicinato? Sono fresco fuori al momento. – bmargulies
possibile duplicato di http://stackoverflow.com/questions/6915/thread-safe-lazy-contruction-of-a-singleton-in-c – kennytm
@bmargulies No, l'interrogante ovviamente non poteva essere infastidito, quindi perché IO? Ho deciso di rinunciare al downvoting e alla chiusura come facinorosi, dato che mi sembra di essere uno dei pochi a preoccuparsi di continuare a fare i conti con SO. E sai, la pigrizia ti fa sentire bene! –