Re: What is the problem with writing singleton in multithreaded enviroment
"Ronen Yacov" <rdiment@gmail.com> wrote in message
news:1168764946.452834.90290@a75g2000cwd.googlegroups.com...
Hi everybody,
When declaring a singleton, we write:
static CMySingle::instance()
{
static CMySingle instance;
return instance;
}
Why should there be a problem in a multithreaded enviroment?
If one thread creates a static object the other threads will have the
same
instance (becuase its static).
And if there is a problem, how the docuble check locking solves it?
The problem with initialising a singleton as you suggest is that the code is
actually written as if it was the following:
static CMySingle::instance()
{
static bool isInitialised = false; // assume initialised by the
linker at link time
if ( !isInitialised )
{
static CMySingle instance;
isInitialised = true;
return instance;
}
}
It is evident that a race condition is possible as follows:
thread A thread B
check isInitialised
(is false)
[CONTEXT SWITCH]
check isInitialised
(is false)
call constructor
set isInitialised = true
[CONTEXT SWITCH]
call constructor
[ERROR - double construction!]
The Double-Checked Locking pattern has its own problems, and will only work
if certain assumptions are made about the order in which the compiler
generates instructions. If the program is running on a multi-core or a
multi-CPU machine, additional considerations apply.
See http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf for
details.
HTH,
Daniel Pfeffer
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]