Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: инициализация синглтона
Форум на CrossPlatform.RU > Разработка > С\С++
Алексей1153
вдруг задумался на такой вещью - нуждается ли область инициализации синглтона в обёртывании в критическую секцию ? Ведь конструктор вызовется при первом прохождении по объявлению статической переменной, а теоретически ситуация с одновременным вызовом MySingl::Inst() из двух потовок вполне возможна


class MySingl
{
    MySingl()
    {
    }

public:
    static MySingl& Inst()
    {
        //область инициализации синглтона
        //{
            static MySingl m;
        //}

        return m;
    }
};
Iron Bug
да. я её всегда снабжаю мьютексом. мало ли какой поток его будет вызывать.
Алексей1153
к примеру, MyMutex - это оболочка для местного класса мутекса.

Тогда вот так нормально ли будет ?

    static MySingl& Inst()
    {
            static MyMutex mutex;

            mutex.Lock();
            static MySingl ms;
            mutex.Unlock();

            return ms;
    }
Влад
Синглтон - это, вообще-то, совсем не простая конструкция, хотя и кажется, что он прост. Об инициализацию синглтона в многопоточных программах и на многопроцессорных машинах столько копий уже сломано.... :-) Обычно используется паттерн double-checked locking.

Может, кому-нибудь пригодится такая реализация:
#ifndef __SINGLETON_H__
#define __SINGLETON_H__

#include <cstdlib>
#include <boost/thread/once.hpp>

template <class T>
class Singleton
{
public:
    static T& Instance();

private:
    Singleton() {};
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);
    virtual ~Singleton() {};

    static void Init() { boost::call_once(m_init, &Singleton<T>::InitImpl); }
    static void InitImpl() { m_me = new T; atexit(&Singleton<T>::FreeInstance); }
    static void FreeInstance() { boost::call_once(m_done, &Singleton<T>::FreeImpl); };
    static void FreeImpl() { delete m_me; m_me = NULL; }
    friend int atexit(void (__cdecl *func)(void));

private:
    static T* volatile m_me;
    static boost::once_flag m_init, m_done;
};

template <class T>
T* Singleton<T>::m_me = NULL;

template <class T>
boost::once_flag Singleton<T>::m_init = BOOST_ONCE_INIT;

template <class T>
boost::once_flag Singleton<T>::m_done = BOOST_ONCE_INIT;

template <class T>
T& Singleton<T>::Instance()
{
      Init();
      return (*m_me);
}

#endif //__SINGLETON_H__
Алексей1153
Влад, никто и не говорит, что он прост. Но вот я резко против приплетания туда шаблонов :)
Iron Bug
Цитата(Алексей1153 @ 20.11.2012, 11:51) *
Но вот я резко против приплетания туда шаблонов

почему? в С++11 вообще красивейшее решение синглтона через шаблоны можно замутить.
шаблоны - это просто удобство программирования, чтобы не писать кучу ненужного кода, который трудно читать.
Алексей1153
Iron Bug, в моём случае не нужно шаблонов. Только поэтому. В общем случае я не против них
ssoft
Обязательно синглтон обрамляется блокировкой.
Либо, если брать Qt, нужно что-то наподобие Q_GLOBAL_STATIC.
Litkevich Yuriy
Цитата(Алексей1153 @ 20.11.2012, 10:51) *
Но вот я резко против приплетания туда шаблонов
это вообще давняя идея для "одиночки". Написал один раз, а потом только его и используешь.
Алексей1153
Litkevich Yuriy, тот, кто будет это потом поддерживать, будет плеваться. Я на себе это уже испытал :) Там шаблонить то нечего, это всё пишется за 5 минут максимум. Раз в полгода
Iron Bug
вот и я тоже юзаю шаблоны, как заготовки. сделал один раз - и юзай потом сколько угодно. просто из практических соображений такие вещи иногда лучше делать один раз и навсегда.
Litkevich Yuriy
Цитата(Алексей1153 @ 21.11.2012, 16:54) *
кто будет это потом поддерживать, будет плеваться
ну сам-то шаблон и поддерживать не надо. Хотя квалификация у людей разная, может кто-то и споткнётся.
Iron Bug
а по-моему так шаблоны как раз очень даже повышают читабельность кода и с ними куда проще программировать.
ssoft
Цитата(Iron Bug @ 22.11.2012, 9:38) *
а по-моему так шаблоны как раз очень даже повышают читабельность кода и с ними куда проще программировать.


Согласен.
Тема правда немного сменилась. Встал вопрос об использовании шаблонов.

Мое мнение такое (если кого-то интересует :D)
Одинаковая реализация singlton в разных кусках программы - это, собственно, копипаст, а копипаст - зло по определению.
Одна ошибка или описка и исправлений куча и скрытых ошибок и т.п. Обязательно вспомнят "добрым словом".
А если программистам сложно разбираться в структурах языка, то ... такие программисты.
А если, например, переводчик сказал, что ему сложно переводить с одного языка на другой? Это его работа!!!

Вообще, программистам пора выползать из песочниц, а то спрашивается - зачем вообще шаблоны в языке? зачем развивают эти страшные шаблоны? они же портят читабельность кода? их же сложно сопровождать? и т.п.
И, что значит низкая квалификация? Пусть повышают свою квалификацию.
Это что теперь норма для всех профессий? Плохие учителя, врачи, юристы, программисты, экономисты? Так мы все про...ем, что еще не успели.
Влад
Цитата(Алексей1153 @ 21.11.2012, 15:54) *
...... тот, кто будет это потом поддерживать, будет плеваться. Я на себе это уже испытал :) Там шаблонить то нечего, это всё пишется за 5 минут максимум. Раз в полгода

То есть, ты предлагаешь в каждом проекте заводить свою реализацию синглтона? Во-первых, это как минимум копипаста, т.е. - зло. Причем, через несколько лет, когда разные программисты будут поддерживать и дописывать эти реализации по-разному, вдруг неожиданно окажется, что эти реализации работают по-разному и нельзя тупо выкорчевать из проекта одну и всунуть другую...
Во-вторых, проекты разные бывают.... Бывают - сильно долгоиграющие. И если в первой версии (простая однопоточная программа) сойдет и классический синглтон Мейерса без всяких защит и блокировок (ибо не от чего защищаться и некого блокировать), то через несколько лет, а то и пару десятков лет, прога лехко может стать многопоточной и для многопроцессорных машинок... И вот тут-то без блокировок и синхронизации уже не обойтись. А когда нужно синхронизировать еще и кэши разных процессоров... о майн готт!

(Я это все как раз проходил, последовательно.... И в результате пришел к выводу, что лучше написать единый шаблонный синглтон (примерно так, как приведено) - "написано однажды, используется везде". А поддерживать там особо-то нечего, - это приблизительно как STL: в исходниках черт ногу сломит, зато использовать без влезания "под капот" легко и приятно.)

Впрочем, свое видение проблемы я не навязываю. Так, высказал общие соображения.....
Алексей1153
Цитата(Влад @ 22.11.2012, 13:04) *
То есть, ты предлагаешь в каждом проекте заводить свою реализацию синглтона?

конечно


но это и требуется то один раз на 5 проектов :)


ssoft, никто не против шаблонов, не заводись ) Тема, как ты правильно отметил, не об этом
Iron Bug
Цитата(Алексей1153 @ 22.11.2012, 15:37) *
конечно

ты очень трудолюбивый программист :D
я программист ленивый, писать два раза одно и то же мне влом. даже раз на пять проектов. и чем реже приходится заниматься копипастом - тем хуже: потому что забываешь детали.
Алексей1153
Цитата(Iron Bug @ 22.11.2012, 16:18) *
ты очень трудолюбивый программист

наговоры! )
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.