class MySingleton
{
public:
MySingleton& Instance()
{
static MySingleton instance;
return instance;
}
};
У кого то есть идеии как на С++ 03 реализовать полностью безопасный синглтон?
class MySingleton
{
public:
MySingleton& Instance()
{
boost::mutex::scoped_lock lock(s_syncRoot);
static MySingleton instance;
return instance;
}
private:
static boost::mutex s_syncRoot;
MySingleton() {}
~MySingleton() {}
MySingleton(MySingleton const &);
MySingleton &operator=(MySingleton const &);
};
хм, ну как-нибудь так:
Код:class MySingleton { public: MySingleton& Instance() { boost::mutex::scoped_lock lock(s_syncRoot); static MySingleton instance; return instance; } private: static boost::mutex s_syncRoot; MySingleton() {} ~MySingleton() {} MySingleton(MySingleton const &); MySingleton &operator=(MySingleton const &); };
Если Instance будет вызван при инициализации еденицы компиляции до инициализации еденицы компиляции MySingleton, это приведет к крашу, так как объект s_syncRoot еще не будет создан.
class Singleton
{
static Singleton* _instance;
static auto_ptr<Singleton> __instanceAuto;
protected:
Singleton() {}
Singleton(Singleton const&);
void operator = (Singleton const&);
public:
static Singleton* Instance()
{
return _instance;
}
virtual ~Singleton() {}
};
Singleton* Singleton::_instance(new Singleton);
auto_ptr<Singleton> Singleton::__instanceAuto(Singleton::_instance);
жесть... мои глаза наливаются кровью..
Это как?)
Как я понял, да. Тогда действительно можно использовать либо системные мутехи, либо атомарные операции, что может быть не очень хорошо по перфомансу в зависимости от интенсивности обращений к синглтону. Либо использовать double-check locking и его производные алгоритмы - сам не проверял. Но опять же, вариант с системными вызовами будет платформозависим.
DCL в С++ без volatile работает херовоВ дебаге будет все ок, а в релизе заебешься искать чего там компилер наоптимизировал.
Мутех конечно хорошо, но дорого.
Мутех конечно хорошо, но дорого.
То есть задача лишь в том чтоб безопасно получить инстанс синглетона из любого потока? Обеспечивать синхронизацию конкретно методов синглетона не нужно?
Если так - то volatile и двойной чек спасет от вредной компиляторной оптимизации.
Но правда в многопроцессорной системе возможен пиздец все равно.
Если можно забить на эффективность - то остается лок делать каждый раз. И функция Instance() конечно static должна быть. Иначе хуевый синглетон как бы.
Проблема не в том чтобы синглтон создать, а в том что статический объект для лока безопасно инициализировать проблематично, точнее даже невозможно, без использования объектов синхронизации ос.
Стой. Еще раз: чем дабл чек локинг не подходит?
Проблема не в том чтобы синглтон создать, а в том что статический объект для лока безопасно инициализировать проблематично, точнее даже невозможно, без использования объектов синхронизации ос.
С волатил - подходит. Если один процессор
Можно подумать бустовый мутех не работает через виндовый мутех