2014-03-31 44 views
11

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」別的東西不安全。但那會很奇怪,所以我錯過了什麼?謝謝!

+0

這可能是OS X上的libstdC++實現有這個問題。我們知道還有其他問題,尤其是許多語言環境功能沒有完全實現(它只是在OS X上使用通用語言環境模型)。 libstdC++在OS X上沒有得到更新。相反,libC++是未來OS X上的標準C++庫實現,您應該嘗試使用它。 – bames53

+0

我更新了我的答案,這不是一個問題,因爲GCC除了linux以外不支持語言環境。 – user657267

+0

@JonathanWakely很高興知道。在哪個版本中添加了xlocale支持? (在這個問題中使用的版本是4.2.1,這個版本已經夠老,我很確定它沒有xlocale支持。) – bames53

回答

4

最新的草案(N3936)明確警告說,不要這樣:

§18.10

6 setlocale函數的調用可能會引入數據競爭與其他 調用setlocale函數或調用到 受當前C語言環境影響的函數。該實現應該表現爲 ,就好像沒有locale :: global()以外的庫函數調用 setlocale函數一樣。

最近的海灣合作委員會的版本限制呼叫LC_NUMERIC而不是LC_ALL,如果您使用的glibc> 2.2的實現通過調用uselocale只修改當前線程(沒多大用了,你在OSX完全避免的問題我猜…)。

編輯:我在源更好看

雖然問題可能與通用語言環境模型發生,如果依賴於C語言環境的函數從另一個線程調用而__convert_from_v或另一個函數修改的C區域設置,通用語言環境模型唯一支持的語言環境是"C"(這是啓動期間設置的語言環境),所以這不是問題,除非對通用模型添加了對其他語言環境的支持。

這可能只是一個問題,如果gcc是用gnu語言環境模型構建的,glibc是< = 2.2,這不會在OSX上發生。

相關問題