crossplatform.ru

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


  Ответ в Шаблон проектирования Singleton (одиночка)
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Влад Дата 29.9.2009, 16:23
  Гм, ну если уж говорить о кроссплатформе, то наиболее изящным решением представляется применение boost::call_once вкупе с boost::once_flag.
Litkevich Yuriy Дата 28.9.2009, 21:59
  ага, уже разобрался, в Вкикпедии прочитал
AD Дата 28.9.2009, 21:16
 
Цитата(Litkevich Yuriy @ 28.9.2009, 22:13) *
а Почему собственно Double? вроде в каждой фукции блокировка одна

Идет двойная проверка. А описано подробно у Александреску! А мне спать больше надо, тогда буду внимательнее... Простите, если что!
Litkevich Yuriy Дата 28.9.2009, 21:13
 
Цитата(Влад @ 29.9.2009, 0:46) *
Double-Checked Locking
а Почему собственно Double? вроде в каждой фукции блокировка одна
Влад Дата 28.9.2009, 20:46
  Ага, этот пример кода выдран с корнем из реально работающего (уж года два как... в режиме 24x7) проекта. m_me - это как раз и есть объект-одиночка, а m_cs - это объект блокировки (под MFC это критическая секция, но, в принципе, с таким же точно успехом при минимальной модификации кода может быть и posix-ный mutex). В коде принципиально, что m_me должен быть именно volatile.

Это - просто пример реализации идиомы Double-Checked Locking, а более подробно о ней может рассказать и гугл; по-моему, тема подробно освещена у классиков типа Мейерса, Саттера.... вот только не помню, у кого точно.
Litkevich Yuriy Дата 28.9.2009, 20:29
  AD, указатель в его примере - m_me
AD Дата 28.9.2009, 20:25
 
Цитата(Litkevich Yuriy @ 28.9.2009, 19:45) *
Влад, поясни пожалуйста свой код.

И m_cs что такое?

Я не Влад, но могу пояснить. Собственно, m_cs указатель на объект одиночки!
Litkevich Yuriy Дата 28.9.2009, 18:45
  Влад, поясни пожалуйста свой код.

И m_cs что такое?
Влад Дата 28.9.2009, 11:23
  Не совсем так. Правильный (имхо) пример кода приведен ниже:
template <class T>
class Singleton
{
    .........
    
private:
    static T* volatile m_me;
};

template <class T>
T& Singleton<T>::Instance()
{
    if (!m_me)
    {
        Locker lock(m_cs);
        if (!m_me)
        {
            m_me = new T;
        }
    }
    return (*m_me);
}

template <class T>
void Singleton<T>::FreeInstance()
{
    if (m_me)
    {
        Locker lock(m_cs);
        if (m_me)
        {
            delete m_me;
            m_me = NULL;
        }
    }
}
AD Дата 27.9.2009, 23:56
 
Цитата(Litkevich Yuriy @ 28.9.2009, 0:17) *
Цитата(Влад @ 28.9.2009, 1:47) *
1. конструкторы-деструкторы, которые ты хочешь скрыть, не обязательно реализовывать с пустым телом {}, достаточно просто объявить их private;
они у меня с пустым телом, т.к. в моём применении они были не нужны.

Ну вот, раз не нужны, то можно объявлять вообще без тела!
Цитата(Litkevich Yuriy @ 28.9.2009, 0:17) *
имеется в виду для основных переменных "Одиночки" (*p_this и cnt)?

Нет. В смысле сделать так:
mutex.lock()
//<какая-то проверка>
mutex.lock()
/// что-то делается....
mutex.unlock()
mutex.unlock()

Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 14.7.2025, 2:37