[RFC] 12658_thread.cc randomly fails (on MP machines)

Paolo Carlini pcarlini@suse.de
Tue Jul 13 08:48:00 GMT 2004


Paolo Carlini wrote:

> Please let me know in case it's better not xfail-ing the old test and 
> instead
> doing something different with it...

Ok, I'm committing the patch, as agreed off line.

Anyway, in the meanwhile the issue is becoming more clear to me. I try 
to tell you how I see it now, since will not be able to help much more 
'til the end of the month. Our trouble basically stems from the nasty 
association of two things:
    1- Two static members, e.g., _S_global and _S_classic.
    2- The reference counted nature of locales.
Point 1- by itself is troublesome in a multithreaded environment, this 
is completely expected, and can be counteracted effectively as we 
(Benjamin) did for locale::global() and locale::locale().
Point 2- is much more nasty, because implies that *any* locale can be in 
fact a ref-copy of _S_global or _S_classic! In principle, *every* 
operation on locales (e.g., also the copy constructor, the assignment 
operator) can be dangerous and must be protected.
Therefore, it looks like we have to make a decision: either we add 
locking bits in a few other places (much better if we can do that with 
zero overhead in the non-multithreaded case), or we can stay with 
something simpler.

A final observation: in fact the most problematic member is obviously 
_S_global, since _S_classic is unchanging and most probably could be 
dealt with in a special way (avoiding the locks!) similarly to the 
static empty string object in basic_string (maybe Nathan had this mind a 
few days ago?)

Paolo.



More information about the Libstdc++ mailing list