【发布时间】:2011-01-07 23:43:43
【问题描述】:
我知道 strtol 和 strtof 比 atoi/atof 更受欢迎,因为前者可以检测错误,而且当涉及到非 base-10 时,strtol 比 atoi 灵活得多。
但我仍然对某些事情感到好奇:OS X 上的“man atoi”(或 atof)(虽然不是在 Linux 上!)提到 atoi/atof 不是线程安全的。坦率地说,我很难想象 atoi 或 atof 的可能实现不是线程安全的。有人知道手册页为什么这么说吗?这些功能在 OS X 或任何其他平台上实际上是不安全的吗?如果是的话,为什么图书馆不直接用 strtol 来定义 atoi,因此是安全的?
【问题讨论】:
-
大多数 atoi 实现似乎只是 strtol 包装器。
-
我已更改此问题的标题,使其至少是一个有效问题。
-
嗯,可以想象一个非线程安全的实现:atof 可以访问当前的语言环境,如果另一个线程更改了语言环境设置,这可能是不安全的。然而,正如 R.. 所指出的,现在 POSIX 似乎要求 atof 是线程安全的。
-
@Jukka:确实,当一个线程使用
setlocale时调用任何依赖于语言环境的函数会导致未定义的行为,但这被认为与那些线程安全的函数是分开的(根据 POSIX)或不是。基本上你不能使用setlocale,除非在创建任何线程之前或在extreme同步下。这就是在 POSIX 2008 中引入uselocale等的原因。