The same problem exists for __rw_get_numpunct.
Farid Zaripov wrote: > > The __rw_get_moneypunct () function in punct.cpp is not thread safe >for the same >facets. If this function is invoked with the same pfacet parameter in >dirrerent threads >simultaneously, then some one thread successfully create __rw_setlocale >object >but other threads will blocked by global mutex in __rw_setlocale ctor. >Then when >the mutex will be released after the updating pfacet->_C_data(), the >next thread will >do the same initialization as the first thread. > > > ChangeLog: > * punct.cpp (__rw_get_moneypunct): After creating __rw_setlocale >object check > if the locale data is initialized by another thread to prevent >multiple initialization\ > of the locale data in facet. > >---------- >Index: punct.cpp >=================================================================== >--- punct.cpp (revision 580097) >+++ punct.cpp (working copy) >@@ -308,6 +308,10 @@ > // set all categories -- need LC_NUMERIC and LC_CTYPE > const __rw_setlocale clocale (locname, _RWSTD_LC_ALL); > >+ if (pfacet->_C_data ()) >+ // call self recursively on already initialized in another >thread `impdata' >+ return __rw_get_moneypunct (pfacet, flags); >+ > // get the lconv data > const lconv* const pconv = localeconv (); > if (!pconv) >---------- > >Farid. >