En multi-threading que la cláusula
if(!p_inst)
{
p_inst = new Singleton();
}
es en realidad 3 acciones separadas. Obtiene el valor de p_inst
, estableciendo el valor de p_inst
y escribiendo el valor de p_inst
. Así que get-set-write significa que debe poner un candado alrededor de p_inst
; de lo contrario, puede tener 2 hilos que crean un valor Singleton
que usa cada subproceso.
Aquí es como se puede ver el problema, asumir que su Singleton
tiene un campo mutable val
:
thread A -> p_inst is NULL
thread B -> p_inst is NULL
thread A -> set to Singleton (1)
thread B -> set to Singleton (2)
thread C -> p_inst is Singleton (2)
thread A -> set val to 4
thread B -> set val to 6
thread C -> get val (it's 6)
thread A -> get val (it's 4!!)
Ves? Hay 2 copias de un Singleton flotando, ninguna de las cuales sabe sobre la otra. El tercer hilo que verifica en el Singleton
solo verá la última asignación. Pero con el bloqueo, puede evitar asignaciones múltiples y este tipo de problemas.
al pegar el código, asegúrese de utilizar espacios en lugar de pestañas, ya que este último daña la marca. – ChrisF
Marque aquí: http://stackoverflow.com/questions/1008019/c-singleton-design-pattern/1008289#1008289 –
El precauciones que tomaría es no aplicar un producto único. Siempre son más problemas de lo que valen. –