[ https://issues.apache.org/jira/browse/STDCXX-1056?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13202721#comment-13202721 ]
Stefan Teleman commented on STDCXX-1056: ---------------------------------------- {noformat} [steleman@darthvader][/src/steleman/programming/stdcxx-gcc/stdcxx-4.2.1-thread-safe/build/tests][02/07/2012 15:06:19][2241]>> ./22.locale.messages.mt --nthreads=4 --nloops=100 # INFO (S1) (10 lines): # TEXT: # COMPILER: gcc 4.5.0, __VERSION__ = "4.5.0 20100604 [gcc-4_5-branch revision 160292]" # ENVIRONMENT: pentium running linux-elf (openSUSE 11.3 (x86_64)) with glibc 2.11 # FILE: 22.locale.messages.mt.cpp # COMPILED: Feb 7 2012, 14:31:03 # COMMENT: thread safety ############################################################ # CLAUSE: lib.locale.messages # NOTE (S2) (5 lines): # TEXT: executing "gencat rwstdmessages.cat rwstdmessages.msg" # CLAUSE: lib.locale.messages # FILE: process.cpp # LINE: 276 # INFO (S1) (3 lines): # TEXT: testing std::messages<charT> with 4 threads, 100 iterations each # CLAUSE: lib.locale.messages # INFO (S1) (3 lines): # TEXT: exercising std::messages<char> # CLAUSE: lib.locale.messages # INFO (S1) (4 lines): # TEXT: requesting a thread pool with 4 threads # CLAUSE: lib.locale.messages # LINE: 503 # INFO (S1) (4 lines): # TEXT: creating a thread pool with 4 threads # CLAUSE: lib.locale.messages # LINE: 548 # INFO (S1) (3 lines): # TEXT: exercising std::messages<wchar_t> # CLAUSE: lib.locale.messages # INFO (S1) (4 lines): # TEXT: requesting a thread pool with 4 threads # CLAUSE: lib.locale.messages # LINE: 503 # INFO (S1) (4 lines): # TEXT: creating a thread pool with 4 threads # CLAUSE: lib.locale.messages # LINE: 548 # INFO (S1) (3 lines): # TEXT: exercising std::messages<char> and std::messages<wchar_t> # CLAUSE: lib.locale.messages # INFO (S1) (4 lines): # TEXT: requesting a thread pool with 4 threads # CLAUSE: lib.locale.messages # LINE: 503 # INFO (S1) (4 lines): # TEXT: creating a thread pool with 4 threads # CLAUSE: lib.locale.messages # LINE: 548 # +-----------------------+----------+----------+----------+ # | DIAGNOSTIC | ACTIVE | TOTAL | INACTIVE | # +-----------------------+----------+----------+----------+ # | (S1) INFO | 11 | 11 | 0% | # | (S2) NOTE | 1 | 1 | 0% | # | (S8) ERROR | 0 | 3 | 100% | # +-----------------------+----------+----------+----------+ [steleman@darthvader][/src/steleman/programming/stdcxx-gcc/stdcxx-4.2.1-thread-safe/build/tests][02/07/2012 15:06:22][2241]>> uname -a Linux darthvader 2.6.34.10-0.4-desktop #1 SMP PREEMPT 2011-10-19 22:16:41 +0200 x86_64 x86_64 x86_64 GNU/Linux [steleman@darthvader][/src/steleman/programming/stdcxx-gcc/stdcxx-4.2.1-thread-safe/build/tests][02/07/2012 15:06:25][2242]>> ldd 22.locale.messages.mt linux-gate.so.1 => (0xffffe000) libpthread.so.0 => /lib/libpthread.so.0 (0xf7705000) /src/steleman/programming/stdcxx-gcc/stdcxx-4.2.1-thread-safe/build/lib/libstd8d.so (0xf75f8000) libm.so.6 => /lib/libm.so.6 (0xf75ce000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xf74dd000) libc.so.6 => /lib/libc.so.6 (0xf7373000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf7355000) /lib/ld-linux.so.2 (0xf7775000) [steleman@darthvader][/src/steleman/programming/stdcxx-gcc/stdcxx-4.2.1-thread-safe/build/tests][02/07/2012 15:07:40][2243]>> ldd ../lib/libstd libstd8d.so@ libstd8d.so.4.2.1* [steleman@darthvader][/src/steleman/programming/stdcxx-gcc/stdcxx-4.2.1-thread-safe/build/tests][02/07/2012 15:07:40][2243]>> ldd ../lib/libstd8d.so.4.2.1 linux-gate.so.1 => (0xffffe000) libc.so.6 => /lib/libc.so.6 (0xf7560000) libm.so.6 => /lib/libm.so.6 (0xf7536000) libpthread.so.0 => /lib/libpthread.so.0 (0xf751b000) /lib/ld-linux.so.2 (0xf77d9000) [steleman@darthvader][/src/steleman/programming/stdcxx-gcc/stdcxx-4.2.1-thread-safe/build/tests][02/07/2012 15:08:06][2244]>> {noformat} > std::moneypunct and std::numpunct implementations are not thread-safe > --------------------------------------------------------------------- > > Key: STDCXX-1056 > URL: https://issues.apache.org/jira/browse/STDCXX-1056 > Project: C++ Standard Library > Issue Type: Bug > Components: 22. Localization > Affects Versions: 4.2.1, 4.2.x, 4.3.x, 5.0.0 > Environment: Solaris 10 and 11, RedHat and OpenSuSE Linux, Sun C++ > Compilers 12.1, 12.2, 12.3 > Issue is independent of platform and/or compiler. > Reporter: Stefan Teleman > Labels: thread-safety > Fix For: 4.2.x, 4.3.x, 5.0.0 > > Attachments: 22.locale.numpunct.mt.out, stdcxx-1056.patch > > > several member functions in std::moneypunct<> and std::numpunct<> return > a std::string by value (as required by the Standard). The implication of > return-by-value > being that the caller "owns" the returned object. > In the stdcxx implementation, the std::basic_string copy constructor uses a > shared > underlying buffer implementation. This shared buffer creates the first > problem for > these classes: although the std::string object returned by value *appears* to > be owned > by the caller, it is, in fact, not. > In a mult-threaded environment, this underlying shared buffer can be > subsequently modified by a different thread than the one who made the initial > call. Furthermore, two or more different threads can access the same shared > buffer at the same time, and modify it, resulting in undefined run-time > behavior. > The cure for this defect has two parts: > 1. the member functions in question must truly return a copy by avoiding a > call to the copy constructor, and using a constructor which creates a deep > copy of the std::string. > 2. access to these member functions must be serialized, in order to guarantee > atomicity > of the creation of the std::string being returned by value. > Patch for 4.2.1 to follow. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira