Синглтонная реализация C++, двойная проверка блокировки
Я много слышал и читал о подходах к реализации синглтонов в C++, таких как Meyer, Phoenix и т. Д., Но все они, похоже, имели проблемы в определенных сценариях использования. Поэтому я придумал свой собственный подход к реализации, Даниэль Синглтон. То, что я хотел бы знать, является ли это правильным или нет... Я думаю, что это так, но, пожалуйста, скажите мне, есть ли у него недостатки, о которых я не думал!
Кроме того, я пытался сделать его поточно-ориентированным, не получая блокировки все время, используя двойную проверку блокировки, о которой я тоже много читал, и все говорили, что она сломана. Я тоже пытался это исправить, и я хотел бы знать, является ли мое решение правильным или нет... а если нет, то как оно может потерпеть неудачу?
2 ответа
Сам по себе шаблон синглтона нарушен тем, что создает ужасный код. Действительно намного лучше использовать внедрение зависимости / инверсию управления. Смотрите мою страницу о том, как избежать синглетонов здесь.
Ваш синглтон-класс слишком сложен. Похоже, что вы реализуете ленивый одноэлементный шаблон, и вы все еще получаете блокировку, поэтому - помимо ненужной запутанности - я не уверен, что то, что вы делаете, сильно отличается от более простых ленивых одноэлементных реализаций. Вы тестировали свою реализацию, чтобы определить, быстрее ли она, чем более простые альтернативы? Я хотел бы видеть явную победу производительности, чтобы пойти с чем-то более сложным.
Шаблон блокировки с двойной проверкой подобен ascii и IEE754 с плавающей запятой. Можно с уверенностью предположить, что он работает достаточно хорошо в каждой системе, которую вы когда-либо видели, хотя формально это не гарантировано.