ostream
運營商<<
使用num_put::put()
進行數字格式化。我正試圖遵守代碼。我會鏈接到OSX文件,但類似的文件出現在我看過的其他系統上。在我看來,那num_put::put()
電話num_put::do_put()
,要求
num_put::_M_insert_float()
,其中calls __convert_from_v()
:ostream運算符<<在libstdC++ thread-hostile中?
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()
檢查當前全局區域,如果它是從「C」不同,那麼它調用setlocale()
全球區域設置爲「C」,然後使用vsnprintf()
來格式化數字,然後再次撥打setlocale()
以恢復到舊的區域設置。
由於setlocale()
影響所有線程,它似乎是叫ostream
運營商<<
用一個浮點數是在多線程應用程序,它具有全局區域設置設爲「C」別的東西不安全。但那會很奇怪,所以我錯過了什麼?謝謝!
這可能是OS X上的libstdC++實現有這個問題。我們知道還有其他問題,尤其是許多語言環境功能沒有完全實現(它只是在OS X上使用通用語言環境模型)。 libstdC++在OS X上沒有得到更新。相反,libC++是未來OS X上的標準C++庫實現,您應該嘗試使用它。 – bames53
我更新了我的答案,這不是一個問題,因爲GCC除了linux以外不支持語言環境。 – user657267
@JonathanWakely很高興知道。在哪個版本中添加了xlocale支持? (在這個問題中使用的版本是4.2.1,這個版本已經夠老,我很確定它沒有xlocale支持。) – bames53