Re: Is this reordering valid?
Martin Bonner wrote:
pongba@gmail.com wrote:
In "C++ and the Perils of Double-Checked Locking", Scott Meyers and
Andrei Alexandrescu brought up a good point on how it is impossible to
avoid the reorder problem.
But I think there might be something that I would disagree. Look at the
code below:
C* pc = new C();
It involves three steps:
1. allocation of raw memory
2. construction of C
3. assignment
The question is, is it really allowed by the standard that 2 and 3
could be reordered?
I can't see any reason why not. Why do you think it isn't?
I'm not sure myself, but consider something like the following:
struct Data {} ;
struct C ;
C* defaultInstance = new C ;
struct C
{
C() {
if ( defaultInstance == NULL ) {
value = new Data ;
defaultInstance = this ;
} else {
value = defaultInstance->value ;
}
}
D* value ;
} ;
I suspect that most programmers would expect this to work.
Although like you, I'm not really sure that the standard
guarantees it, and there is a simple work-around, guaranteed to
work: wrap the new in a function which returns the pointer.
(This introduces a sequence point between the new expression and
the assignment.)
Note that even wrapping the new in a function doesn't make
double checked locking work, because the guarantees given by the
standard only affect the observable behavior in a single thread.
Another thread is not guaranteed to see the writes in the same
order they occur; in fact, the standard doesn't guarantee any
order of the writes, as long as changing the order doesn't
affect observable behavior.
--
James Kanze Gabi Software email: kanze.james@neuf.fr
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! ]