ostream
оператор <<
использует num_put::put()
для форматирования чисел. Я пытаюсь выполнить код. Я привяжусь к файлам OSX, но похожие файлы появятся на некоторых других системах, на которые я смотрел. Мне кажется, что num_put::put()
вызывает num_put::do_put()
, который вызывает
num_put::_M_insert_float()
, который calls __convert_from_v()
:
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
operator <<
с числом с плавающей запятой является небезопасным в многопоточном приложении, которое имеет глобальную локаль, установленную на что-то другое, чем "C" . Но это было бы очень странно, так что мне не хватает? Спасибо!