为什么 OSX 将 atoi/atof 记录为不是线程安全的?

2024-04-19

我知道 strtol 和 strtof 比 atoi/atof 更受青睐,因为前者检测错误,而且在非基数 10 方面,strtol 比 atoi 灵活得多。

但我仍然对一些事情感到好奇:OS X 上的“man atoi”(或 atof)(尽管不在 Linux 上!)提到 atoi/atof 不是线程安全的。坦率地说,我很难想象 atoi 或 atof 的可能实现不是线程安全的。有谁知道为什么手册页这么说?这些函数在 OS X 或任何其他平台上实际上不安全吗?如果是的话,为什么图书馆不直接用 strtol 来定义 atoi,从而保证安全呢?


看一下 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().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 OSX 将 atoi/atof 记录为不是线程安全的? 的相关文章

随机推荐