Re: Threadsafe singletons
Matthias Hofmann wrote:
"David Barrett-Lennard" <firstname.lastname@example.org> schrieb im Newsbeitrag
I've often used something similar; I've even posted about it
once or twice here. In my case, I use an explicit pointer and
new, but the principle is the same. Except that I know how an
explicit pointer and new work---I can only guess as to how the
compiler ensures creation on only the first call to GetInstance.
At least some compilers, in a threaded environment, use
something like pthread_once to initialize the variable, so
constructing it before entering main isn't necessary.
Good point. I didn't know some compilers would do that.
What exactly is the problem with creation of a local static
object and threads?
The code generated by most compilers isn't thread safe.
Typically, there will be a hidden static bool which says whether
the object has been initialized or not; the compiler tests this,
and if it is false, calls the constructor, and then sets it to
true. If no particular steps are taken by the compiler, this
isn't thread safe.
Formally, there is no guarantee that static variables are
constructed before entering main, so you have no guaranteed that
your s_init object (or my ourInstance pointer) will be
initialized before entering main.
Really! Are you referring to the C++ standard?
It is described in 3.6.2/3. If I understand this part of the
standard correctly, it does, however, guarantee that the
ourInstance pointer will be initialized before it is first
It guarantees that the pointer will be initialized before the
first use of anything defined in the translation unit. In
particular, it guarantees that the pointer will be initialized
before the first call to Singleton::GetInstance().
The standard requires this to work even in the presence of
circular dependencies, which is manifestly impossible. But it
doesn't matter, because no implementation takes advantage of the
rule; they all initialize before entering main (at least when
James Kanze GABI Software
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]