Re: Threadsafe singletons
David Barrett-Lennard wrote:
kanze wrote:
Earl Purple wrote:
David Barrett-Lennard wrote:
///////////// header
class MySingleton
{
public:
static MySingleton& GetInstance();
private:
MySingleton();
};
////////////// cpp
MySingleton& MySingleton::GetInstance()
{
static MySingleton s;
return s;
}
Is this not threadsafe anyway (assuming you have a
compliant compiler?). There should be only one instance of
a static regardless of race conditions.
Should is a very vague word. According to what standard?
The C++ standard says that as soon as you invoke
pthread_create, or something along those lines, you have
undefined behavior. And Posix doesn't say anything about
it.
From a quality of implementation point of view, I'd say you
were right. From a practical point of view, however, most
compilers don't seem to guarantee that this function is
thread safe.
I don't like the idea that the compiler would take upon itself
the need to insert thread-safety code.
It does all the time. Luckily for us, because otherwise, we
couldn't use it in a multithreaded environment.
Otherwise how do you optimize for cases where you know you
don't need multi-thread protection?
A special option to the compiler?
Also, where does it end?
Where ever the standard says it ends:-). That's the problem
here---there's no standard.
Imagine if the compiler tried to protect all your global
variables as well, or made sure reading and writing double
precision floats were atomic.
Imagine if it didn't ensure that the compiler generated
temporaries were not static. Or if it didn't provide correct
locking around those that weren't---this was the case with g++
pre 3.0, and you couldn't use that compiler for code which would
run in a multithreaded environment.
Fundamentally, it is almost the same issue here. The problem is
a compiler generated bool, which you, as the user, don't have
access to. It's not quite the same thing as the static
variables involved in, say, the stack walkback of exception
handling, but there is a basic principle involved. If I write:
void
f()
{
static int const xxx = 42 ;
// ...
}
no locking is required by the user. So I would expect the same
to hold for:
void
f()
{
static std::string const xxx( "doh" ) ;
// ...
}
--
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! ]