我知道errno是线程安全的,在Linux中还有另外两个类似的函数,即strerror和strerror_r。根据Robert Lover的书《Linux系统编程》所说,strerror不是线程安全的,但strerror_r是线程安全的。因此,我想知道perror是否线程安全。
perror
是线程安全的。perror
列为非线程安全:
http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html由POSIX.1-2008定义的所有函数都应该是线程安全的,除了以下函数1不需要是线程安全的[...]
C11标准(早期标准没有承认多线程)的引用:
7.1.4 使用库函数
[...]
4 标准库中的函数不能保证可重入,并且可能修改具有静态或线程存储期的对象。188)
5 除非在接下来的详细描述中明确说明,否则库函数应按以下方式防止数据竞争:库函数不得直接或间接地访问当前线程以外的线程可访问的对象,除非这些对象是通过函数的参数直接或间接访问的。库函数不得直接或间接地修改当前线程以外的线程可访问的对象,除非这些对象是通过函数的非const参数直接或间接访问的。189) 如果对象对用户不可见并受到数据竞争的保护,则实现可以在线程之间共享其自己的内部对象。
如果perror
的所有参数都无法被其他线程同时访问(因此它们上面不能存在数据竞争),perror
就是线程安全的,就像所有其他未列出显式异常的C11标准库函数一样。
perror
也是如此,但并非所有函数都是。C11规定:“除非在后续的详细描述中明确说明,库函数应按以下方式防止数据竞争。”例如,strerror
C11规定:“strerror
函数不需要避免与其他对strerror
函数的调用之间的数据竞争。” - ouah
perror
函数是线程安全的。 - ouah