我知道errno是线程安全的。在Linux中,还有另外两个类似的函数,即strerror和strerror_r。根据Robert Lover的书Linux System Programming
,strerror不是线程安全的,但是strerror_r是。所以我想知道perror是否是线程安全的。
答案 0 :(得分:4)
在POSIX系统(如Linux)中,perror
是线程安全的。
perror
在此处未列为非线程安全:
本卷POSIX.1-2008定义的所有函数都是线程安全的,但以下函数1不需要是线程安全的。 [...]
http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html
答案 1 :(得分:1)
引用C11(早期的标准根本不承认多线程):
7.1.4库函数的使用
[...]
4标准库中的函数不保证是可重入的,可以修改 具有静态或线程存储持续时间的对象.188)
5除非在下面的详细说明中另有明确说明,否则库 函数应防止数据竞争如下:库函数不应直接或 间接访问除当前线程以外的线程可访问的对象,除非 通过函数的参数直接或间接访问对象。图书馆 函数不应直接或间接修改除以外的线程可访问的对象 除非通过函数直接或间接访问对象,否则返回当前线程 非const参数.189)实现可以在它们之间共享它们自己的内部对象 如果对象对用户不可见并且受到数据竞争保护,则为线程。
如果perror
的任何参数都不能被其他线程同时访问(因此不能对它们进行数据竞争),perror
是线程安全的,就像所有其他C11标准库一样没有列出明确异常的函数。