crossplatform.ru

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

Алексей1153
  опции профиля:
сообщение 19.11.2012, 8:52
Сообщение #1


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

Группа: Участник
Сообщений: 2944
Регистрация: 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Влад
  опции профиля:
сообщение 19.11.2012, 13:39
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 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   инициализация синглтона   19.11.2012, 8:52
- - Iron Bug   да. я её всегда снабжаю мьютексом. мало ли какой п...   19.11.2012, 10:26
- - Алексей1153   к примеру, MyMutex - это оболочка для местного кла...   19.11.2012, 10:45
- - Влад   Синглтон - это, вообще-то, совсем не простая конст...   19.11.2012, 13:39
- - Алексей1153   Влад, никто и не говорит, что он прост. Но вот я р...   20.11.2012, 8:51
- - Iron Bug   Цитата(Алексей1153 @ 20.11.2012, 11:51) Н...   20.11.2012, 9:22
- - Алексей1153   Iron Bug, в моём случае не нужно шаблонов. Только...   20.11.2012, 13:00
- - ssoft   Обязательно синглтон обрамляется блокировкой. Либо...   20.11.2012, 13:28
- - Litkevich Yuriy   Цитата(Алексей1153 @ 20.11.2012, 10:51) Н...   21.11.2012, 12:49
- - Алексей1153   Litkevich Yuriy, тот, кто будет это потом поддержи...   21.11.2012, 14:54
- - Iron Bug   вот и я тоже юзаю шаблоны, как заготовки. сделал о...   21.11.2012, 17:44
- - Litkevich Yuriy   Цитата(Алексей1153 @ 21.11.2012, 16:54) к...   21.11.2012, 22:03
- - Iron Bug   а по-моему так шаблоны как раз очень даже повышают...   22.11.2012, 8:38
|- - ssoft   Цитата(Iron Bug @ 22.11.2012, 9:38) а по-...   22.11.2012, 9:40
- - Влад   Цитата(Алексей1153 @ 21.11.2012, 15:54) ....   22.11.2012, 10:04
- - Алексей1153   Цитата(Влад @ 22.11.2012, 13:04) То есть,...   22.11.2012, 12:37
- - Iron Bug   Цитата(Алексей1153 @ 22.11.2012, 15:37) к...   22.11.2012, 13:18
- - Алексей1153   Цитата(Iron Bug @ 22.11.2012, 16:18) ты о...   25.11.2012, 10:26


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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 15.7.2025, 13:09