[c++-pthreads] Initialization of local static mutex

Mark Mitchell mark at codesourcery.com
Sun Oct 8 17:25:43 UTC 2006


Roland Schwarz wrote:

> "The zero-initialization of all local objects with static
> storage duration is performed before any other initialization
> takes place. A local object of POD type with static storage
> duration initialized with constant-expressions is initialized
> before its block is first entered. ..."

Yes, I've read this.  (I've spent more than a decade working on C++ 
compilers, the C++ standard, and C++ ABIs.)

> Does this mean, the compiler is allowed to emit code to initialize
> the mutex variable at runtime, after "any other initializations
> have taken place" and before "block is entered"?

Yes.

> A compiler is still conforming in this case, while at the same
> time susceptible to the race.

No.  If the initialization occurs before the block is entered, there is 
no race, independent of when and how that initialization occurs.  The 
race can only occur inside the block.

In some sense, the question you're asking has no well-formed answer. 
The C++ standard doesn't mention threads; therefore, it can't talk about 
thread-safety.  Therefore, if you need to formally validate of your 
program that it is thread-safe, you're going to need look beyond the C++ 
stnadard, or even the POSIX standard; you're going to need to define 
your own model.

However, in practice, your code is safe.  There are other issues around 
thread-safe initialization of statics with a constant initializers which 
are addressed by some C++ ABIs, but you have the simpler case of a 
constant initializer.

-- 
Mark Mitchell
CodeSourcery
mark at codesourcery.com
(650) 331-3385 x713



More information about the c++-pthreads mailing list