digitalmars.D.learn - synchonized? correct use? Thread-safe Singleton
- BLS (19/19) Jan 04 2008 Do I have a THread-safe singleton ? If not HowTo.. Sorry. Sean K
Do I have a THread-safe singleton ? If not HowTo.. Sorry. Sean K allready explains it to me, but I 've lost the info. :( Bjoern class Singleton(T) { public: static T instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new T; return _instance; } private: this() {} static T _instance; } class Application : Singleton!(Application) { }
Jan 04 2008
Reply to bls,Do I have a THread-safe singleton ? If not HowTo.. Sorry. Sean K allready explains it to me, but I 've lost the info. :( Bjoern class Singleton(T) { public: static T instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new T; return _instance; } private: this() {} static T _instance; } class Application : Singleton!(Application) { }I think this will fail because Singleton!(Application).instance() will call Application's this() and that is private. IMHO, a better approach (that I haven't tested) would be to use a mixin: template Singleton(T) { public: static T instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new T; return _instance; } private: this() {} static T _instance; } class Application : Singleton!(Application) { mixin(Singleton!(typeof(this))); }
Jan 04 2008
BCS schrieb:Reply to bls,Thanks BCS, Confused ...'cause virus infected (me) not the pc class Application : Singleton!(Application) { mixin(Singleton!(typeof(this))); this() { return instance(this) } } Honk, that stinks somehow ! Hope I ask not for too much, but please explain the use of the mixin BjoernDo I have a THread-safe singleton ? If not HowTo.. Sorry. Sean K allready explains it to me, but I 've lost the info. :( Bjoern class Singleton(T) { public: static T instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new T; return _instance; } private: this() {} static T _instance; } class Application : Singleton!(Application) { }I think this will fail because Singleton!(Application).instance() will call Application's this() and that is private. IMHO, a better approach (that I haven't tested) would be to use a mixin: template Singleton(T) { public: static T instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new T; return _instance; } private: this() {} static T _instance; } class Application : Singleton!(Application) { mixin(Singleton!(typeof(this))); }
Jan 04 2008
Reply to bls,BCS schrieb:Oops, typo!! class Application // no ": ..."Reply to bls,Thanks BCS, Confused ...'cause virus infected (me) not the pc class Application : Singleton!(Application) { mixin(Singleton!(typeof(this))); this() { return instance(this) } } Honk, that stinks somehow !Do I have a THread-safe singleton ? If not HowTo.. Sorry. Sean K allready explains it to me, but I 've lost the info. :( Bjoern class Singleton(T) { public: static T instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new T; return _instance; } private: this() {} static T _instance; } class Application : Singleton!(Application) { }I think this will fail because Singleton!(Application).instance() will call Application's this() and that is private. IMHO, a better approach (that I haven't tested) would be to use a mixin: template Singleton(T) { public: static T instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new T; return _instance; } private: this() {} static T _instance; } class Application : Singleton!(Application) { mixin(Singleton!(typeof(this))); }Hope I ask not for too much, but please explain the use of the mixinThink of a mixin as a copy/paste + macro. Instance the template (that's the macro part) and just lump it into whatever scope you use it in (the copy/paste part). It's a quick way to do boiler plate coding.Bjoern
Jan 04 2008
BCS schrieb:Reply to bls,Thanks BCS:BCS schrieb:Oops, typo!! class Application // no ": ..."Reply to bls,Thanks BCS, Confused ...'cause virus infected (me) not the pc class Application : Singleton!(Application) { mixin(Singleton!(typeof(this))); this() { return instance(this) } } Honk, that stinks somehow !Do I have a THread-safe singleton ? If not HowTo.. Sorry. Sean K allready explains it to me, but I 've lost the info. :( Bjoern class Singleton(T) { public: static T instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new T; return _instance; } private: this() {} static T _instance; } class Application : Singleton!(Application) { }I think this will fail because Singleton!(Application).instance() will call Application's this() and that is private. IMHO, a better approach (that I haven't tested) would be to use a mixin: template Singleton(T) { public: static T instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new T; return _instance; } private: this() {} static T _instance; } class Application : Singleton!(Application) { mixin(Singleton!(typeof(this))); }Hope I ask not for too much, but please explain the use of the mixinThink of a mixin as a copy/paste + macro. Instance the template (that's the macro part) and just lump it into whatever scope you use it in (the copy/paste part). It's a quick way to do boiler plate coding.BjoernAh, that makes more sense :) Okay . Now; to make it smart . class Application { class Singleton { } } You mean ... shi. ? very very big grin Seriously? I need a bullet proof thread safe singleton implementation .. Hell I should change my BLS into LS , people here are sometimes confused. Bjoernclass Application // no ": ..."
Jan 04 2008
Reply to bls,BCS schrieb:template Singleton(T) { public: static T instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new T; return _instance; } private: this() {} static T _instance; } class Application : Singleton!(Application) { mixin(Singleton!(typeof(this))); }class Application // no ": ..." Ah, that makes more sense :) Okay . Now; to make it smart . class Application { class Singleton { } } You mean ... shi. ?Almost. It might not be important, but because Singleton is a template rather than a templated class, the inner class you show doesn't exist. You more or less end up getting this: class Application { public: static Application instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new Application; return _instance; } private: this() {} static Application _instance; }
Jan 04 2008
BCS schrieb:Reply to bls,Okay, I see. Last question,(promised) As far as I can remember Sean and I talked about to use volatile ... here it is http://www.digitalmars.com/d/archives/digitalmars/D/Threadsafe_singleton_using_volatile_synchonized_53768.html What do you think ? BjoernBCS schrieb:template Singleton(T) { public: static T instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new T; return _instance; } private: this() {} static T _instance; } class Application : Singleton!(Application) { mixin(Singleton!(typeof(this))); }class Application // no ": ..." Ah, that makes more sense :) Okay . Now; to make it smart . class Application { class Singleton { } } You mean ... shi. ?Almost. It might not be important, but because Singleton is a template rather than a templated class, the inner class you show doesn't exist. You more or less end up getting this: class Application { public: static Application instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new Application; return _instance; } private: this() {} static Application _instance; }
Jan 04 2008
Reply to bls,Okay, I see. Last question,(promised) As far as I can remember Sean and I talked about to use volatile ... here it is http://www.digitalmars.com/d/archives/digitalmars/D/Threadsafe_singlet on_using_volatile_synchonized_53768.html What do you think ? BjoernThread safety isn't my thing, sorry.
Jan 04 2008
BCS schrieb:Reply to bls,Anyway, thanks for spending your time :)Okay, I see. Last question,(promised) As far as I can remember Sean and I talked about to use volatile ... here it is http://www.digitalmars.com/d/archives/digitalmars/D/Threadsafe_singlet on_using_volatile_synchonized_53768.html What do you think ? BjoernThread safety isn't my thing, sorry.
Jan 04 2008
BLS schrieb:Do I have a THread-safe singleton ? If not HowTo.. Sorry. Sean K allready explains it to me, but I 've lost the info. :( Bjoern class Singleton(T) { public: static T instance() sychronized // according to the language spec this should work { if(_instance is null) _instance = new T; return _instance; } private: this() {} static T _instance; } class Application : Singleton!(Application) { }Okay, I'll have to think more about this stuff. In case that somebody can offer a templated (thread-safe and bulletproof) Singleton class. ... THANKS Bjoern
Jan 04 2008