2009-06-27 15 views
12

Quanto segue è un'implementazione ben nota del modello singleton in C++.
Tuttavia, non sono completamente sicuro che sia sicuro per i thread.
In base alle risposte a domande simili poste qui in precedenza, sembra che sia sicuro.
È così?Implementazione singleton sicura in thread in C++

//Curiously Recurring Template Pattern  
//Separates a class from its Singleton-ness (almost).  
#include <iostream> 
using namespace std; 

template<class T> class Singleton { 
    Singleton(const Singleton&); 
    Singleton& operator=(const Singleton&); 
protected: 
    Singleton() {} 
    virtual ~Singleton() {} 
public: 
    static T& instance() { 
    static T theInstance; 
    return theInstance; 
    } 
}; 

// A sample class to be made into a Singleton 
class MyClass : public Singleton<MyClass> { 
int x; 
protected: 
    friend class Singleton<MyClass>; 
    MyClass() { x = 0; } 
public: 
void setValue(int n) { x = n; } 
    int getValue() const { return x; } 
}; 
+0

Perché l'hai reso un WIKI? È una domanda completamente valida. – JaredPar

+0

non hai fornito alcun motivo per cui * tu * ritieni che l'implementazione del pattern non sia thread-safe. Per favore fallo. – gogole

+0

qual è lo scopo della classe di amici qui? qualcuno può rispondere? –

risposta

13

No, questo non è sicuro perché il locale statico non è protetto in alcun modo. Di default un locale statico non è thread-safe. Ciò significa che è possibile eseguire nei seguenti problemi

  • costruzione per la singleton viene eseguito più di una volta
  • L'assegnazione alla statico non è sempre garantito atomico quindi si vedeva una cessione parziale in scenari multi-threaded
  • Probabilmente alcuni altri che mi manca.

Ecco una voce di blog dettagliata di Raymond Chen sul perché le statistiche C++ non sono thread-safe per impostazione predefinita.

+1

Ottima risorsa Jared. – Ankur

+0

sì grazie per il link, mi ha aperto gli occhi. –

+0

quindi in pratica questo significa che non è possibile fare un singleton agnostico del sistema operativo che utilizza C++, ovvero hai sempre bisogno di una sezione critica o simile per farne uno? –

0

Non è threadsafe, a meno che non si configura il compilatore di generare codice per threadsafe accessi statici.

Tuttavia, è meglio che il codice sia autonomo, quindi aggiungerei un mutex qua e là.

1

È NON thread-safe. Per diventare sicuri per i thread, è necessario aggiungere un controllo prima del blocco (blocco semaforo) e un altro controllo dopo il blocco. E poi sei sicuro che anche nella chiamata simultanea da thread diversi tu fornisca un'istanza.

0

Se siete ancora l'interesse su questo argomento e se si sta utilizzando un C++ 11 compilatore standard è possibile trovare here proposta del pattern Singleton in un ambiente multithreading.