Мейерс синглтон потокобезопасный с C++-98

В настоящее время у меня есть эта реализация синглтона Мейера:

class ClassA
{
public:
    static ClassA& GetInstance()
    {                   
        static ClassA instance;     
        return instance;
    }   

private:
    ClassA::ClassA() {};

    // avoid copying singleton
    ClassA(ClassA const&);
    void operator = (ClassA const&);
};

Теперь мне нужны некоторые улучшения для обеспечения безопасности этого потока кода в C++-98 и VS-2008?!

Спасибо!

PS: что неясно? Вы видите теги visual-studio-2008 и C++-98 ->, поэтому целевой ОС является Windows! Я также не понимаю, почему за меня проголосовали, только некоторые люди вообще не любят синглтонов!

1 ответ

Решение

Синглтон Meyer не является лучшим решением в целом, особенно в многопоточной среде. Более общий способ реализации синглтона:

class ClassA
{
    static ClassA* ourInstance;
    //  ctor's, etc.
public:
    static ClassA& instance();
};

и в исходном файле:

ClassA* ClassA::ourInstance = &instance();

// This can be in any source file.
ClassA&
ClassA::instance()
{
    if ( ourInstance == NULL ) {
        ourInstance = new ClassA;
    }
    return *ourInstance;
}

Это потокобезопасно, если до входа не было создано ни одной темыmain (что должно иметь место), и он не загружается динамически (что также должно иметь место - если объект должен быть уникальным и доступным из конструкторов статических объектов, то он должен быть их при запуске статических конструкторов). Это также имеет то преимущество, что позволяет избежать любых проблем уничтожения.

Другие вопросы по тегам