crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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 Текстовая версия Сейчас: 28.3.2024, 20:10