小编Ale*_*ski的帖子

是libstdc ++线程中的ostream操作符<< hostile?

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
Run Code Online (Sandbox Code Playgroud)

__convert_from_v()检查当前的全局语言环境,如果它与"C"不同,则调用setlocale()将全局语言环境设置为"C",然后用于vsnprintf()格式化数字,然后setlocale()再次调用以恢复为旧的语言环境.

由于setlocale()影响所有线程,因此在多线程应用程序中调用具有浮点数的ostream运算符似乎<<是不安全的,该应用程序将全局语言环境设置为"C"以外的其他位置.但那会很奇怪,所以我错过了什么?谢谢!

c++ locale thread-safety libstdc++

11
推荐指数
1
解决办法
357
查看次数

标签 统计

c++ ×1

libstdc++ ×1

locale ×1

thread-safety ×1