Lấy một cái nhìn tại các trang hướng dẫn trên hệ điều hành MacOS X 10.6.6, nó tài liệu hai chức năng, atof()
và atof_l()
, và tôi nghi ngờ rằng đưa ra một gợi ý là tại sao hàm được coi là không thread-safe:
SYNOPSIS
#include <stdlib.h>
double atof(const char *str);
#include <xlocale.h>
double atof_l(const char *str, locale_t loc);
MÔ tẢ
Các Hàm atof()
chuyển đổi phần ban đầu của chuỗi được trỏ tới bởi str thành biểu diễn kép.
Nó tương đương với:
strtod(str, (char **)NULL);
Nhân vật dấu thập phân được xác định trong chương trình địa phương (loại LC_NUMERIC).
Trong khi chức năng atof()
sử dụng ngôn ngữ hiện tại, chức năng atof_l()
có thể được chuyển trực tiếp bằng ngôn ngữ. Xem xlocale (3) để biết thêm thông tin.
THI THUYẾT
Chức năng atof()
không phải là thread-safe và cũng không async-hủy-an toàn.
Chức năng atof()
không được dùng nữa bởi strtod()
và không được sử dụng trong mã mới.
LỖI
Chức năng atof()
không cần phải ảnh hưởng đến giá trị của errno
về một lỗi.
Nghi ngờ của tôi là nếu ngôn ngữ hiện tại bị thay đổi bởi một chuỗi khác trong khi chức năng atof()
đang thực thi, kết quả không được đảm bảo. Nếu không, có vẻ như không có lý do gì cho cảnh báo.
Tôi đã chọc xung quanh vị trí chính xác của mã nguồn thư viện Darwin C, nhưng chưa tìm thấy. Nếu bạn đi đến mã nguồn FreeBSD cho atoi()
, rõ ràng là việc thực hiện chức năng là tầm thường:
int
atoi(str)
const char *str;
{
return (int)strtol(str, (char **)NULL, 10);
}
(Vâng, thậm chí không sử dụng một định nghĩa prototyped!)
Các trang người đàn ông cho strtol()
không có từ ngữ chồn về an toàn luồng hoặc an toàn-hủy bỏ an toàn. Tuy nhiên, một cái nhìn nhanh chóng vào mã nguồn cho strtol()
cho thấy rằng nó sử dụng isspace()
, mà bị ảnh hưởng bởi ngôn ngữ:
ISO/IEC 9899: 1999, Phần 7.11.1.1 Chức năng setlocale
Các hàm duy nhất trong 7.4 có hành vi không bị ảnh hưởng bởi ngôn ngữ hiện tại là isdigit và isxdigit.
(Trong trường hợp §7.4 là dành cho <ctype.h>
.)
Bây giờ, trong khi tôi không chắc chắn rằng mã này giống hệt như những gì trong Darwin (hệ điều hành MacOS X), nó có khả năng là tương tự. Tôi nghĩ rằng có thể có chỗ cho errata trong các trang của người đàn ông - nó không phải là quá rõ ràng cho dù trang cần chỉnh sửa là một cho atoi()
hoặc một cho strtol()
.
Câu hỏi thú vị ... – ChristopheD
hầu hết các triển khai atoi chỉ là trình bao bọc strtol. – Anycorn
Tôi đã thay đổi tiêu đề của câu hỏi này sao cho nó ít nhất là một câu hỏi hợp lệ. –