Re: Threadsafe singletons
Liviu wrote:
kanze wrote:
David Barrett-Lennard wrote:
I think that's a shame. I like to be able to have code
knowingly run before main() begins. For example, to allow
factories to self-register with a singleton factory
registry.
You're not alone.
As a person who deals with legacy code which relies on this
kind of behaviour (not mandated by the standard as previously
pointed out) I must tell you that it can very quickly become a
mess from pov of both implementation and usage. There are more
robust techniques which can accomplish the same goal.
Such as? I know a few work-arounds, but they generally involve
automatically generating code and tampering with the rules in
the makefile. And while that doesn't bother me, I know a lot of
C++ programmers who don't feel as comfortable as I do writing
and maintaining makefiles.
Do you know of any compilers that don't execute the s_init
constructor before main()?
There aren't any (supposing static linking, of course). And
there won't be, for two reasons:
If the namespace scope objects have dynamic initialization
then their initialization falls under 3.6.2 p3. Such a code
will not be portable since it relies on implementation-defined
behaviour.
It has been pointed out that Apple once had a compiler which
tried to take advantage of this paragraph. I've not used that
compiler, so I cannot say, but I know how to write conforming
code which wouldn't work for all of the implementations I'm
aware of---the standard makes no exception for circular
dependencies, and it is very easy to create cases where the
standard requires the initialization of module A to run before
that in module B, and vice versa.
The class code discussed is as simple as an example need be
but in general it is safe to assume a singleton will acquire
some resource and the implementation will require dynamic
initialization, therefore will be subject to 3.6.2 p3.
Certainly. But it's also quite simple to create standard
conforming code which will fail if the implementation does not
initialize before main. Such code probably doesn't occur often,
if ever, in real applications, but the standard requires that
such artificially constructed programs work, too. And when the
standard starts requiring that the initialization of variable a
run before that of variable b, AND that the initialization of
variable b run before that of a, there's not much an
implementation can do what will be conform.
--
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! ]