Как стать автором
Обновить

Комментарии 7

находяться

Как можно было это написать? Ведь это даже не предлагается мобильной клавиатурой.

мне так больше нравиться

Плохо, но хотя бы можно свалить вину на авто-завершение слова.

Не используйте в современном С++ реализацию, приведенную в "Design Patterns" GoF, она имеет много проблем, в частности, data race в многопоточных программах.

Поподробней можно, где там data race.

Плохо, но хотя бы можно свалить вину на авто-завершение слова.

Спасибо, исправил.

Поподробней можно, где там data race.

В книге "Design Patterns" приводиться следующий пример.

class Singleton {
public:
   static Singleton* Instance();
protected:
   Singleton();
private:
   static Singleton* _instance;
};
Singleton* Singleton::Instance () {
   if (_instance == 0) {
      _instance = new Singleton;
   }
   return _instance;
}

Как известно, одновременное чтение и запись одной и той же неатомарной переменной из разных потоков — data race (оно же UB). Что и происходит, если поток 1 записывает _instance (строка 3), а поток 2 читает (строка 2).

Но это еще нормально, ведь это 90-ые годы, тогда еще многопоточки в стандарте не было. Просто не нужно использовать его в многопоточной программе, ну и хотя бы добавить delete _instance.

Мне больше нравится такое написание (код ниже), которое, как ни странно, встречается нередко.

Singleton* Singleton::Instance() 
{
   if (!instance) 
   {
      std::lock_guard<std::mutex> lock(mutex);
      instance = new Singleton;
   }
   return instance;
}

Что автор хочет этим сказать? Что это можно использовать в многопоточной программе или зачем тогда lock_guard?

По факту, здесь тот же data race.

Это вообще другой, ничего похожего с синглтоном в статье.

И опять приводиться. Что сложного в проверке "что делает"?

Это синглтон.

И в статье как раз сказано, что синглтона из GoF не будет, так как ...

У вас тоже гонка. После захвата мьютекса нужно опять проверить на существование объекта (его мог уже другой поток создать). Нужен классический дабл чек.

Вообще синглтон зло. Причем не только потому что нарушает S в SOLID. Лучше что-то вроде дипенденси инвершион контейнера, фабрики бинов (аля спринг) или ещё чего-нибудь подобного.

У вас тоже гонка.

Где? В статье не используется mutex вообще. Если речь про комментарий, то там так и написано, что это гонка.

Singleton* Singleton::Instance() 
{
   if(!instance) 
   {
      std::lock_guard<std::mutex> lock(mutex);
      if(!instance)
         instance = new Singleton;
   }
   return instance;
}

С точки зрения гонки этот код ничем не лучше того, что был в предыдущем комментарии.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории