perror是线程安全的吗?

3

我知道errno是线程安全的,在Linux中还有另外两个类似的函数,即strerror和strerror_r。根据Robert Lover的书《Linux系统编程》所说,strerror不是线程安全的,但strerror_r是线程安全的。因此,我想知道perror是否线程安全。

2个回答

5

C11提供了更好的保证。 - Deduplicator
@Deduplicator 如果你选择使用c11,那么perror函数是线程安全的。 - ouah

1

C11标准(早期标准没有承认多线程)的引用:

7.1.4 使用库函数

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

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


就像所有其他C11标准库函数一样,perror也是如此,但并非所有函数都是。C11规定:“除非在后续的详细描述中明确说明,库函数应按以下方式防止数据竞争。”例如,strerror C11规定:“strerror函数不需要避免与其他对strerror函数的调用之间的数据竞争。” - ouah
@ouah:总是有你没有读到的几个词很重要。在函数描述中添加了显式异常的可能性,以适用于一般情况。感谢您的阅读。 - Deduplicator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接