Re[2]: Как защитить mutex singletona
От: Аноним  
Дата: 06.04.11 18:46
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, Аноним, Вы писали:


А>> Как можно защитится от этого ?

C>
C>        template <typename T> class Singletone
C>        {
C>            static T * m_instance;
C>            static SIMPLE_MUTEX m_mutex;
C>            static void CreateInstance()
C>            {
C>                SIMPLE_MUTEX::lockT lock_(m_mutex);
C>                static T loc_instance;
C>                m_instance = &loc_instance;
C>            }
C>        public:
C>            static T * Instance()
C>            {
C>                if (!m_instance)
C>                    CreateInstance();
C>                return m_instance;
C>            };
C>        }; // class Singletone<T>
C>        template <typename T> T * Singletone<T>::m_instance = NULL;
C>        template <typename T> SIMPLE_MUTEX Singletone<T>::m_mutex;
C>

C>

В вашей ситуации все еще хуже, сначала могут быть обращения к CreateInstance а потом только инициализация
template <typename T> SIMPLE_MUTEX Singletone<T>::m_mutex; Помимо оставшейся ситуации, когда объект был создан раньше template <typename T> SIMPLE_MUTEX Singletone<T>::m_mutex , и имеет возможность дернуть метод уже после разрушения m_mutex. Не говоря уже о том, что создание статической переменной не гаранировано ПОСЛЕ захвата мутекса, она же статическая, я так понимаю компилятор спокойно сможет начать строить ее при первом обращении к функции, а потом туда влезет другой поток... и что тогда ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.