2009-06-27 9 views
12

La siguiente es una implementación bien conocida del patrón singleton en C++.
Sin embargo, no estoy del todo seguro de si es seguro para subprocesos.
Según las respuestas a una pregunta similar que se haya hecho anteriormente, parece que es seguro para subprocesos.
¿Es eso así?Implementación segura de singleton de subprocesos en 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

¿Por qué hiciste esto un WIKI? Es una pregunta completamente válida. – JaredPar

+0

no dio ningún motivo por el que * usted * piensa que la implementación del patrón no es segura para subprocesos. Por favor, hazlo. – gogole

+0

¿Cuál es el objetivo de la clase de amigos aquí? alguien puede responder? –

Respuesta

13

No, esto no es seguro para subprocesos porque el local estático no está protegido de ninguna manera. Por defecto, un local estático no es seguro para subprocesos. Esto significa que podría funcionar en las siguientes cuestiones

  • Constructor para el singleton ejecuta más de una vez
  • La asignación a la estática, no se garantiza que sea atómica por lo tanto, se podía ver una cesión parcial en escenarios multi-hilo
  • Probablemente algunos más de los que me estoy perdiendo.

Aquí hay una entrada de blog detallada de Raymond Chen sobre por qué la estática de C++ no es segura para subprocesos por defecto.

+1

Excelente recurso Jared. – Ankur

+0

sí, gracias por el enlace, me abrió los ojos. –

+0

así que básicamente esto significa que no es posible hacer un singleton agnóstico del sistema operativo que usa C++? es decir, ¿siempre necesita alguna sección crítica o similar para hacer una? –

0

No es multihebra, a menos que configure su compilador para generar código multi-hilo de accesos estáticos.

Sin embargo, es mejor que el código sea independiente, así que agregaría un mutex aquí y allá.

1

ES NO hilo de seguridad. Para volverse seguro con hilos, debe agregar un cheque antes del bloqueo (bloqueo de semáforo) y otra comprobación después del bloqueo. Y entonces está seguro de que incluso en una llamada simultánea desde diferentes hilos, usted proporciona una instancia.

0

Si todavía interés en este tema y si está utilizando una C++ 11 compilador estándar puede encontrar here una propuesta del patrón singleton en un entorno multiproceso.

Cuestiones relacionadas