看一下 MacOS X 10.6.6 上的手册页,它记录了两个功能,atof()
and atof_l()
,我怀疑这暗示了为什么该函数被认为不是线程安全的:
SYNOPSIS
#include <stdlib.h>
double atof(const char *str);
#include <xlocale.h>
double atof_l(const char *str, locale_t loc);
描述
The atof()
函数将 str 指向的字符串的初始部分转换为双精度表示形式。
它相当于:
strtod(str, (char **)NULL);
小数点字符在程序的区域设置(类别 LC_NUMERIC)中定义。
虽然atof()
函数使用当前语言环境,atof_l()
函数可以直接传递区域设置。有关详细信息,请参阅 xlocale(3)。
实施说明
The atof()
函数不是线程安全的,也不是异步取消安全的。
The atof()
函数已被弃用strtod()
并且不应在新代码中使用。
ERRORS
功能atof()
不需要影响的价值errno
出现错误。
我的怀疑是,如果当前区域设置被另一个线程更改,而atof()
函数正在执行,不保证结果。否则,似乎没有理由发出警告。
我已经四处寻找 Darwin C 库源代码的明确位置,但还没有找到。如果您访问 FreeBSD 源代码,很明显函数的实现是微不足道的:
int
atoi(str)
const char *str;
{
return (int)strtol(str, (char **)NULL, 10);
}
(是的,甚至没有使用原型定义!)
的手册页strtol()
没有关于线程安全或异步取消安全的狡猾措辞。不过,快速浏览一下源代码显示它使用isspace()
,受语言环境影响:
ISO/IEC 9899:1999,第 7.11.1.1 节 setlocale 函数
187 The only functions in 7.4 whose behavior is not affected by the current locale are isdigit and isxdigit.
(其中第 7.4 节适用于<ctype.h>
.)
现在,虽然我不确定这段代码与 Darwin (MacOS X) 中的代码是否相同,但它很可能是相似的。我认为手册页中可能有勘误的空间 - 目前还不清楚需要更正的页面是否是atoi()
或用于strtol()
.