Thread overview | ||||||
---|---|---|---|---|---|---|
|
May 26, 2007 Threadsafe singleton using volatile,synchonized | ||||
---|---|---|---|---|
| ||||
Probabely I should use D-Learn instead but due to the fact that it is about compiler optimizing ... blah, blah ; Simple question : Is this singleton implementation thread safe ? Makes : static volatile Singleton _instance sense ? module pattern.singleton class Singleton { public: static Singleton getInstance() { // double check lock if (_instance is null) { synchronized { if (_instance is null) { _instance = new Singleton(); } } } return _instance; } private: this() {} // do not optimize static volatile Singleton _instance; } Bjoern |
May 26, 2007 Re: Threadsafe singleton using volatile,synchonized | ||||
---|---|---|---|---|
| ||||
Posted in reply to BLS | BLS wrote: > Probabely I should use D-Learn instead but due to the fact that it is about compiler optimizing ... blah, blah ; Simple question : Is this singleton implementation thread safe ? Makes : static volatile Singleton _instance > sense ? > > module pattern.singleton > > class Singleton { > public: > static Singleton getInstance() > { > // double check lock > if (_instance is null) > { > synchronized { > if (_instance is null) { > _instance = new Singleton(); > } > } > } > return _instance; } > private: > this() {} > // do not optimize static volatile Singleton _instance; > } No. The 'volatile' qualifier is applied to a statement, not a variable. You need to do something like this: # class Singleton # { # static Singleton s; # # Singleton instance() # { # volatile Singleton tmp = s; # if(!tmp) # { # synchronized # { # tmp = s; # if(!tmp) # { # volatile tmp = new Singleton(); # s = tmp; # } # } # } # return s; # } # } This is from: http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=9260 in thread: http://www.digitalmars.com/d/archives/digitalmars/D/9149.html#N9231 Sean |
May 26, 2007 Re: Threadsafe singleton using volatile,synchonized | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sean Kelly | Thanks Sean, indeed a very interesting thread.
From 2004;It is really worth to browse the archives!
What is the reason/rationale for using volatile in this way ?
Another Question:
Is something like this available
CriticalSectionBegin()
{
// Your Single thread code goes here
}
CriticalSectionEnd()
Bjoern
Sean Kelly Wrote:
> BLS wrote:
> > Probabely I should use D-Learn instead but due to the fact that it is about compiler optimizing ... blah, blah ; Simple question : Is this singleton implementation thread safe ? Makes :
> > static volatile Singleton _instance
> > sense ?
> >
> > module pattern.singleton
> >
> > class Singleton
> > {
> > public:
> > static Singleton getInstance()
> > {
> > // double check lock
> > if (_instance is null)
> > {
> > synchronized {
> > if (_instance is null)
> > {
> > _instance = new Singleton();
> > }
> > }
> > }
> > return _instance;
> > }
> > private:
> > this() {}
> >
> > // do not optimize
> > static volatile Singleton _instance;
> > }
>
>
> No. The 'volatile' qualifier is applied to a statement, not a variable.
> You need to do something like this:
>
> # class Singleton
> # {
> # static Singleton s;
> #
> # Singleton instance()
> # {
> # volatile Singleton tmp = s;
> # if(!tmp)
> # {
> # synchronized
> # {
> # tmp = s;
> # if(!tmp)
> # {
> # volatile tmp = new Singleton();
> # s = tmp;
> # }
> # }
> # }
> # return s;
> # }
> # }
>
> This is from:
>
> http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=9260
>
> in thread:
>
> http://www.digitalmars.com/d/archives/digitalmars/D/9149.html#N9231
>
>
> Sean
|
May 27, 2007 Re: Threadsafe singleton using volatile,synchonized | ||||
---|---|---|---|---|
| ||||
Posted in reply to BLS | BLS wrote: > Thanks Sean, indeed a very interesting thread. > From 2004;It is really worth to browse the archives! > What is the reason/rationale for using volatile in this way ? In D, 'volatile' is a statement rather than a storage attribute. So you need to use it explicitly in places where you want to restrict compiler-based code movement. In the code below, a temporary is used to ensure that Singleton (s) is fully constructed before s is set, otherwise the compiler could theoretically do this: s = new Singleton; // translates to s = allocate_memory for Singleton; s.ctor(); The presence of 'volatile' is to ensure that the compiler doesn't try to eliminate 'tmp' entirely and just use 's', since that would be a legal optimization. > Another Question: > Is something like this available > > CriticalSectionBegin() > { > // Your Single thread code goes here > } > CriticalSectionEnd() Other than synchronized? Could you provide more detail? Sean |
Copyright © 1999-2021 by the D Language Foundation