gpt4 book ai didi

c++ - setlocale 是线程安全函数吗?

转载 作者:可可西里 更新时间:2023-11-01 16:28:25 25 4
gpt4 key购买 nike

我需要更改线程中的区域设置以正确解析带有 strtod() 的 double ,为此我使用 setlocale() (C++)。它是线程安全的吗?

更新:另一个问题。当我在 main() 函数中调用 setlocale() 时,它不会影响更深层次的其他例程。为什么???代码很多,写chunk的时候有问题。

最佳答案

在 C++11 中,标准线程现在是该语言的受支持部分。该标准明确指出,setlocale() 调用会与其他对 setlocale() 的调用或对受当前 C 语言环境(包括 strtod())影响的函数的调用引入数据竞争。 locale::global() 函数被认为表现得好像它调用了 setlocale(),因此它也可能引入数据竞争(如下所述)。

在带有 glibc 的 Linux 上它是 MT-unsafe (const:locale env)让线程使用非 NULL 参数同时调用 setlocale() 并调用任何其他可能使用全局语言环境的函数(数据竞争,因此 C11 中的未定义行为)。建议使用uselocale()相反,它是 MT 安全的,并且只更改调用线程的语言环境。在使用 C++ 代码中的 libstdc++ 的 Linux 上,您应该避免 locale::global(进程范围内的更改)并为线程使用创建一个语言环境(出于与 C 运行时相同的原因,locale::global 是 MT 不安全的)。鉴于您的目标是使用 strtod(C API),您应该使用 uselocale()。

在使用 glibc 的 Linux 上,setlocale() 函数本身是 MT 不安全的,除非您满足 2 个严格的标准,并且根据 POSIX 的要求更改整个过程的语言环境。新的 Linux 手册页(Red Hat and Fujitsu work to specify MT-safety notations for all APIs 的一部分)标记为 setlocale()作为“MT-Unsafe const:locale env”,这意味着 setlocale 是 MT 安全的 IFF 你保持语言环境不变(通过不修改它,只是通过传递 NULL 来查询它),如果你保持语言环境和环境不变(到如果参数是 ""),避免更改语言环境。在使用 glibc 的 Linux 上,如果您只想更改调用线程的区域设置,您应该使用 uselocale(),因为这是 MT 安全的并且不以任何方式依赖于您的环境,并且 strtod 将使用线程的区域设置。同样,所有实现 POSIX 的系统都应提供 uselocale() 以在线程上下文(MT 安全)中使用。

OS X 实现了 uselocale(),因此您可以使用它。

在 Windows 上,如果 setlocale() 在整个进程或线程上运行(将其转换为您需要的 uselocale),则使用 _configthreadlocale 进行更改,但对于 C++ 代码,您应该再次使用 use an instance of the locale class and avoid locale::global .

关于c++ - setlocale 是线程安全函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4057319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com