Краткое руководство по освоению одноэлементного шаблона проектирования в многопоточной среде.
Шаблон проектирования Singleton гарантирует, что класс имеет только один экземпляр, и обеспечивает глобальную точку доступа к классу. Класс создает экземпляр самого себя один раз и снова и снова использует один и тот же объект. Попробуем сформулировать, как управлять созданием объекта.
- Объект инициализируется с помощью конструктора, поэтому важно сделать конструктор закрытым, чтобы объект не имел своего конструктора при создании экземпляра.
- Создание объекта не может быть через конструктор, поэтому нам нужна эта функциональность в классе, чтобы дать ссылку на объект. Это может быть достигнуто с помощью статических функций-членов и статических элементов данных.
- Для этого нам нужно создать объект статического класса и передать этот объект через статическую функцию. Это будет единственный объект класса.
Давайте посмотрим на пример кода, чтобы охватить вопросы до сих пор.
Этот дизайн прекрасно подходит, если система является однопоточной. В многопоточных системах несколько потоков могут вызвать функцию getInstance
в первый раз, и в результате будет создано несколько экземпляров, что разрушает цель шаблона одноэлементного проектирования.
Проблема может быть решена с помощью locks
и обработки getInstance
функции как критической секции. Критический раздел — это сегмент кода, в котором процессы получают доступ к общим ресурсам. Давайте посмотрим на псевдокод.
acquire lock // CRITICAL SECTION CODE exit section (release lock)
В C++ мы могли бы использовать блокировки мьютексов, которые поддерживают такие операции, как lock
и unlock
. Давайте посмотрим на код с блокировкой мьютекса.
И последнее: использование избытка блокировок может привести к утечке ресурсов; замки дорогие. Небольшая оптимизация может состоять в том, чтобы использовать блокировки только тогда, когда экземпляр класса еще не создан, то есть только в первый раз.
Спасибо за прочтение!!!