crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> инициализация синглтона
Алексей1153
  опции профиля:
сообщение 19.11.2012, 8:52
Сообщение #1


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


вдруг задумался на такой вещью - нуждается ли область инициализации синглтона в обёртывании в критическую секцию ? Ведь конструктор вызовется при первом прохождении по объявлению статической переменной, а теоретически ситуация с одновременным вызовом MySingl::Inst() из двух потовок вполне возможна


class MySingl
{
    MySingl()
    {
    }

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

        return m;
    }
};


Сообщение отредактировал Алексей1153 - 19.11.2012, 8:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 19.11.2012, 10:26
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


да. я её всегда снабжаю мьютексом. мало ли какой поток его будет вызывать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 19.11.2012, 10:45
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


к примеру, MyMutex - это оболочка для местного класса мутекса.

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

    static MySingl& Inst()
    {
            static MyMutex mutex;

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

            return ms;
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 19.11.2012, 13:39
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Синглтон - это, вообще-то, совсем не простая конструкция, хотя и кажется, что он прост. Об инициализацию синглтона в многопоточных программах и на многопроцессорных машинах столько копий уже сломано.... :-) Обычно используется паттерн 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
  опции профиля:
сообщение 20.11.2012, 8:51
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Влад, никто и не говорит, что он прост. Но вот я резко против приплетания туда шаблонов :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 20.11.2012, 9:22
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Алексей1153 @ 20.11.2012, 11:51) *
Но вот я резко против приплетания туда шаблонов

почему? в С++11 вообще красивейшее решение синглтона через шаблоны можно замутить.
шаблоны - это просто удобство программирования, чтобы не писать кучу ненужного кода, который трудно читать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 20.11.2012, 13:00
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Iron Bug, в моём случае не нужно шаблонов. Только поэтому. В общем случае я не против них
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 20.11.2012, 13:28
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

Спасибо сказали: 30 раз(а)




Репутация:   3  


Обязательно синглтон обрамляется блокировкой.
Либо, если брать Qt, нужно что-то наподобие Q_GLOBAL_STATIC.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.11.2012, 12:49
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Алексей1153 @ 20.11.2012, 10:51) *
Но вот я резко против приплетания туда шаблонов
это вообще давняя идея для "одиночки". Написал один раз, а потом только его и используешь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 21.11.2012, 14:54
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Litkevich Yuriy, тот, кто будет это потом поддерживать, будет плеваться. Я на себе это уже испытал :) Там шаблонить то нечего, это всё пишется за 5 минут максимум. Раз в полгода
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 2:09