В многопоточность, что пункт
if(!p_inst)
{
p_inst = new Singleton();
}
на самом деле 3 отдельные действия. Вы получаете значение p_inst
, устанавливая значение p_inst
и записывая значение p_inst
. Таким образом, get-set-write означает, что вам нужно поместить блокировку вокруг p_inst
, иначе вы можете иметь 2 потока, которые создают значение Singleton
, которое использует каждый поток.
Вот как вы можете просмотреть этот вопрос, предположит, что ваш Singleton
имеет изменяемое поле 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!!)
Вы видите? Там есть 2 копии Синглтона, о которых никто не знает. Третий поток, который проверяет на Singleton
, увидит только последнее задание. Но с блокировкой вы можете предотвратить множественное назначение и эти проблемы.
при вставке кода убедитесь, что вы используете пробелы, а не вкладки, так как последний придает отметку уценке. – ChrisF
Проверьте здесь: http://stackoverflow.com/questions/1008019/c-singleton-design-pattern/1008289#1008289 –
Меры предосторожности, которые я бы взял, это не реализовать одноэлементный режим. У них всегда больше проблем, чем их стоит. –