ostream
Operator <<
verwendet num_put::put()
für die Formatierung von Zahlen. Ich versuche dem Code zu folgen. Ich verlinke auf OSX-Dateien, aber ähnliche Dateien erscheinen auf einigen anderen Systemen, die ich angeschaut habe. Es scheint mir, dass num_put::put()
Anrufe num_put::do_put()
, die
num_put::_M_insert_float()
nennt, die calls __convert_from_v()
:Ist Ostream-Operator << in libstdC++ Thread-feindlich?
http://www.opensource.apple.com/source/libstdcxx/libstdcxx-60/include/c++/4.2.1/bits/c++locale.h
http://www.opensource.apple.com/source/libstdcxx/libstdcxx-60/include/c++/4.2.1/bits/locale_facets.tcc
http://www.opensource.apple.com/source/libstdcxx/libstdcxx-60/include/c++/4.2.1/bits/locale_facets.h
__convert_from_v()
prüfen die aktuellen globalen locale, und wenn es von „C“ ist anders dann nennt es setlocale()
die globalen Locale zu setzen, um "C", verwendet dann vsnprintf()
, um die Nummer zu formatieren, und ruft dann erneut setlocale()
auf, um zum alten Gebietsschema zurückzukehren.
Da setlocale()
alle Themen betrifft, so scheint es, dass ostream
Operator <<
mit einem Gleitkommazahl Aufruf in einer Multi-Threaded-Anwendung nicht sicher ist, welche die globale Locale auf etwas anderes als „C“ gesetzt hat. Aber das wäre sehr seltsam, was vermisse ich dann? Vielen Dank!
Es kann sein, dass die libstdC++ - Implementierung auf OS X dieses Problem hat. Es ist bekannt, dass es andere Probleme gibt, insbesondere wenn viele Gebietsschemamerkmale nicht vollständig implementiert sind (es verwendet nur das generische Gebietsschemamodell unter OS X). libstdC++ wird unter OS X nicht aktualisiert. Stattdessen wird libC++ die Standard-C++ - Bibliotheksimplementierung unter OS X sein und Sie sollten versuchen, diese zu verwenden. – bames53
Ich habe meine Antwort aktualisiert, es ist kein Problem, da GCC auf allem außer Linux Gebietsschemas nicht unterstützt. – user657267
@ JonathanWakely Das ist gut zu wissen. In welcher Version wurde die Unterstützung von xlocale hinzugefügt? (Die in dieser Frage verwendete Version ist 4.2.1, die alt genug ist, dass ich ziemlich sicher bin, dass sie xlocale nicht unterstützt hat.) – bames53