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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 17)
Iron Bug
  опции профиля:
сообщение 19.11.2012, 10:26
Сообщение #2


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

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

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




Репутация:   12  


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


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

Группа: Участник
Сообщений: 2944
Регистрация: 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


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

Группа: Участник
Сообщений: 2944
Регистрация: 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


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

Группа: Участник
Сообщений: 2944
Регистрация: 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


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

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

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




Репутация:   34  


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


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

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

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




Репутация:   12  


вот и я тоже юзаю шаблоны, как заготовки. сделал один раз - и юзай потом сколько угодно. просто из практических соображений такие вещи иногда лучше делать один раз и навсегда.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.11.2012, 22:03
Сообщение #12


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

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

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




Репутация:   94  


Цитата(Алексей1153 @ 21.11.2012, 16:54) *
кто будет это потом поддерживать, будет плеваться
ну сам-то шаблон и поддерживать не надо. Хотя квалификация у людей разная, может кто-то и споткнётся.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.11.2012, 8:38
Сообщение #13


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

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

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




Репутация:   12  


а по-моему так шаблоны как раз очень даже повышают читабельность кода и с ними куда проще программировать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 22.11.2012, 9:40
Сообщение #14


Участник
**

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

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




Репутация:   3  


Цитата(Iron Bug @ 22.11.2012, 9:38) *
а по-моему так шаблоны как раз очень даже повышают читабельность кода и с ними куда проще программировать.


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

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

Вообще, программистам пора выползать из песочниц, а то спрашивается - зачем вообще шаблоны в языке? зачем развивают эти страшные шаблоны? они же портят читабельность кода? их же сложно сопровождать? и т.п.
И, что значит низкая квалификация? Пусть повышают свою квалификацию.
Это что теперь норма для всех профессий? Плохие учителя, врачи, юристы, программисты, экономисты? Так мы все про...ем, что еще не успели.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 22.11.2012, 10:04
Сообщение #15


Участник
**

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

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




Репутация:   8  


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

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

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

Впрочем, свое видение проблемы я не навязываю. Так, высказал общие соображения.....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 22.11.2012, 12:37
Сообщение #16


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

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

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




Репутация:   34  


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

конечно


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


ssoft, никто не против шаблонов, не заводись ) Тема, как ты правильно отметил, не об этом
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.11.2012, 13:18
Сообщение #17


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

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

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




Репутация:   12  


Цитата(Алексей1153 @ 22.11.2012, 15:37) *
конечно

ты очень трудолюбивый программист :D
я программист ленивый, писать два раза одно и то же мне влом. даже раз на пять проектов. и чем реже приходится заниматься копипастом - тем хуже: потому что забываешь детали.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 25.11.2012, 10:26
Сообщение #18


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

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

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




Репутация:   34  


Цитата(Iron Bug @ 22.11.2012, 16:18) *
ты очень трудолюбивый программист

наговоры! )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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