未定义的行为,具有setlocale和多线程
Undefined behavior with setlocale and multithreading?
cppref状态 2016-12-13 09:00 UTC :
因为setLocale修改了全局状态,从而影响执行 依赖语言环境的功能,是未定义的行为 一个线程,而另一个线程正在执行以下的任何 功能:
std::fprintf, std::isprint, std::iswdigit, std::localeconv, std::tolower, std::fscanf, std::ispunct, std::iswgraph, std::mblen, std::toupper, std::isalnum, std::isspace, std::iswlower, std::mbstowcs, std::towlower, std::isalpha, std::isupper, std::iswprint, std::mbtowc, std::towupper, std::isblank, std::iswalnum, std::iswpunct, std::setlocale, std::wcscoll, std::iscntrl, std::iswalpha, std::iswspace, std::strcoll, std::wcstod, std::isdigit, std::iswblank, std::iswupper, std::strerror, std::wcstombs, std::isgraph, std::iswcntrl, std::iswxdigit, std::strtod, std::wcsxfrm, std::islower, std::iswctype, std::isxdigit
。
这个信息似乎...至少令人惊讶。
我知道它会影响全球状态,我对此很好(否则我会使用其他方法来更改语言环境)。
我总是假设的(我认为VC 至少以这种方式实现了它)setlocale
是线程安全与使用语言环境的功能。
较新的C 标准(和C
?)(实际上完全合并了螺纹)对此说什么?
对于C11,标准明确指出
呼叫
setlocale
功能可能会与其他人一起引入数据竞赛 调用setlocale
函数或打电话给函数的调用 受当前语言环境的影响。实施的行为应像 没有库功能调用setLocale函数。
所以,不,setlocale
不应该是线程安全,除非您的平台提供额外的保证。
由于这是C 通常只是指的是C库的东西,所以我的期望是那里是相同的。
实际上,这意味着在启动任何补充线程之前,您应该仅在多线程程序的启动中使用setlocale
。
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 成员变量在多线程 C++ 时自行更改
- 未定义的行为,具有setlocale和多线程