perror线程安全吗?

时间:2014-07-22 23:29:05

标签: c linux unix posix posix-api

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

2 个答案:

答案 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标准库一样没有列出明确异常的函数。

相关问题