Здравствуйте, 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. Не говоря уже о том, что создание статической переменной не гаранировано ПОСЛЕ захвата мутекса, она же статическая, я так понимаю компилятор спокойно сможет начать строить ее при первом обращении к функции, а потом туда влезет другой поток... и что тогда ?