Краткое руководство по освоению одноэлементного шаблона проектирования в многопоточной среде.

Шаблон проектирования Singleton гарантирует, что класс имеет только один экземпляр, и обеспечивает глобальную точку доступа к классу. Класс создает экземпляр самого себя один раз и снова и снова использует один и тот же объект. Попробуем сформулировать, как управлять созданием объекта.

  1. Объект инициализируется с помощью конструктора, поэтому важно сделать конструктор закрытым, чтобы объект не имел своего конструктора при создании экземпляра.
  2. Создание объекта не может быть через конструктор, поэтому нам нужна эта функциональность в классе, чтобы дать ссылку на объект. Это может быть достигнуто с помощью статических функций-членов и статических элементов данных.
  3. Для этого нам нужно создать объект статического класса и передать этот объект через статическую функцию. Это будет единственный объект класса.

Давайте посмотрим на пример кода, чтобы охватить вопросы до сих пор.

Этот дизайн прекрасно подходит, если система является однопоточной. В многопоточных системах несколько потоков могут вызвать функцию getInstance в первый раз, и в результате будет создано несколько экземпляров, что разрушает цель шаблона одноэлементного проектирования.

Проблема может быть решена с помощью locksи обработки getInstance функции как критической секции. Критический раздел — это сегмент кода, в котором процессы получают доступ к общим ресурсам. Давайте посмотрим на псевдокод.

acquire lock
// CRITICAL SECTION CODE
exit section (release lock)

В C++ мы могли бы использовать блокировки мьютексов, которые поддерживают такие операции, как lock и unlock. Давайте посмотрим на код с блокировкой мьютекса.

И последнее: использование избытка блокировок может привести к утечке ресурсов; замки дорогие. Небольшая оптимизация может состоять в том, чтобы использовать блокировки только тогда, когда экземпляр класса еще не создан, то есть только в первый раз.

Спасибо за прочтение!!!