Re: Am I or Alexandrescu wrong about singletons?
On Mar 20, 7:12 am, Ulrich Eckhardt <eckha...@satorlaser.com> wrote:
Leigh Johnston wrote:
"Joshua Maurice" <joshuamaur...@gmail.com> wrote in message
news:900580c6-c55c-46ec-b5bc-1a9a2f0d76f5@w9g2000prb.googlegroups.com...
Obviously the volatile keyword may not cause a memory
barrier instruction to be emitted but this is a side
issue. The combination of a memory barrier and volatile
makes multi-threaded code work.
No. Memory barriers when properly used (without the
volatile keyword) are sufficient.
No. Memory barriers are not sufficient if your optimizing
compiler is caching the value in a register: the CPU is not
aware that the register is referring to data being revealed
by the memory barrier.
Actually, memory barriers in my understanding go both ways.
One is to tell the CPU that it must not cache/optimise/reorder
memory accesses. The other is to tell the compiler that it
must not do so either.
Actually, as far as standard C++ is concerned, memory barriers
don't exist, so it's difficult to talk about them. In practice,
there are three ways to obtain them:
-- Inline assembler. See your compiler manual with regards to
what it guarantees; the standard makes no guarantees here.
A conforming implementation can presumably do anything it
wants with the inline assembler, including move it over an
access to a volatile variable. From a QoI point of view,
either 1) the compiler assumes nothing about the assembler,
considers that it might access any accessible variable, and
ensures that the actual semantics of the abstract machine
correspond to those specified in the standard, 2) reads and
interprets the inline assembler, and so recognizes a fence
or a memory barrier, and behaves appropriately, or 3)
provides some means of annotating the inline assember to
tell the compiler what it can or cannot do.
-- Call a function written in assembler. This really comes
down to exactly the same as inline assembler, except that
it's a lot more difficult for the compiler to implement the
alternatives 2 or 3. (All compilers I know implement 1.)
-- Call some predefined system API. In this case, the
requirements are defined by the system API. (This is the
solution used by Posix, Windows and C++0x.)
--
James Kanze
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]