Мейерс синглтон потокобезопасный с 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
(что должно иметь место), и он не загружается динамически (что также должно иметь место - если объект должен быть уникальным и доступным из конструкторов статических объектов, то он должен быть их при запуске статических конструкторов). Это также имеет то преимущество, что позволяет избежать любых проблем уничтожения.