3

我知道 errno 是线程安全的。而在 Linux 中,还有另外 2 个类似的函数,即 strerror 和 strerror_r。根据Linux System ProgrammingRobert Lover 的书,strerror 不是线程安全的,但 strerror_r 是。所以我想知道 perror 是否是线程安全的。

4

2 回答 2

5

在 POSIX 系统(如 Linux)中,perror是线程安全的。

perror此处未列为非线程安全:

本卷 POSIX.1-2008 定义的所有函数都应是线程安全的,但以下函数 1 不需要是线程安全的。[...]

http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html

于 2014-07-22T23:33:23.900 回答
1

引自 C11(早期标准根本不承认多线程):

7.1.4 库函数的使用

[...]
4 标准库中的函数不保证是可重入的,并且可能会修改具有静态或线程存储持续时间的对象。188)
5 除非在随后的详细描述中另有明确说明,否则库函数应防止数据竞争,如下所示: 库函数不得直接或间接访问当前线程以外的线程可访问的对象,除非这些对象是通过函数的直接或间接访问论据。库函数不得直接或间接修改当前线程以外的线程可访问的对象,除非这些对象是通过函数的非常量参数直接或间接访问的。189) 如果对象不是,实现可以在线程之间共享它们自己的内部对象对用户可见并受到保护以防止数据竞争。

如果perror其他线程都不能同时访问 to 的任何参数(因此它们上不能存在数据竞争),perror则它是线程安全的,就像所有其他没有列出显式异常的 C11 标准库函数一样。

于 2014-07-22T23:59:50.540 回答