2009-06-27 14 views
12

Poniżej znajduje się dobrze znana implementacja wzorca singleton w C++.
Jednak nie jestem do końca pewien, czy wątek bezpieczny.
Na podstawie odpowiedzi na podobne pytanie zadane poprzednio, wydaje się, że jest bezpieczny dla wątków.
Czy to prawda?Implementacja singleton safe thread w 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

Dlaczego zrobiłeś to WIKI? To całkowicie poprawne pytanie. – JaredPar

+0

nie podałeś żadnych powodów, dla których * ty * uważasz, że implementacja wzorca nie jest bezpieczna dla wątków. Proszę zrób. – gogole

+0

jaki jest cel klasy przyjaciół? czy ktoś może odpowiedzieć? –

Odpowiedz

13

Nie, to nie jest bezpieczne dla wątków, ponieważ lokalny statyczny nie jest w żaden sposób chroniony. Domyślnie lokalna lokalizacja nie jest bezpieczna dla wątków. Oznacza to można uruchomić w następujących kwestiach

  • Konstruktor dla Singleton biegnie więcej niż raz
  • Przypisanie do statycznej nie jest gwarancją atomowy stąd widać częściową zadanie w wielowątkowych scenariuszy
  • Prawdopodobnie kilka innych, których mi brakuje.

Oto szczegółowy wpis blogu autorstwa Raymonda Chena o tym, dlaczego statyka C++ nie jest domyślnie bezpieczna dla wątków.

+1

Doskonałe źródło Jareda – Ankur

+0

Tak, dziękuję za link, otworzyło mi to oczy –

+0

więc w zasadzie oznacza to, że nie można tego zrobić agnostyczny singleton OS używający C++? czyli zawsze potrzebujesz jakiejś krytycznej sekcji lub czegoś podobnego do zrobienia jednego? –

0

Nie jest bezpieczny dla wątków, chyba że skonfigurujesz kompilator do generowania kodów wątków w przypadku dostępu statycznego.

Jednak lepiej, żeby kod był samowystarczalny, więc dodawałbym muteks tu i tam.

1

TO NIE wątku bezpieczne. Aby stać się bezpiecznym w wątku, należy dodać czek przed blokadą (blokada semafora) i inną kontrolę po zamknięciu. A wtedy jesteś pewien, że nawet przy jednoczesnym wywołaniu z różnych wątków podajesz jedną instancję.

0

Jeśli nadal zainteresowanie na ten temat, a jeśli używasz C++ 11 standardowego kompilatora można znaleźć here propozycja wzorzec Singleton w środowisku wielowątkowym.