在中errno.h,此变量被声明为extern int errno;是我的问题,errno在某些调用之后检查值还是在多线程代码中使用perror()是安全的。这是线程安全变量吗?如果没有,那还有什么选择呢?
errno.h
extern int errno;
errno
我在x86体系结构上将Linux与gcc一起使用。
是的,它是线程安全的。在Linux上,全局errno变量是特定于线程的。POSIX要求errno必须是线程安全的。
参见http://www.unix.org/whitepapers/reentrant.html
在POSIX.1中,errno被定义为外部全局变量。但是,此定义在多线程环境中是不可接受的,因为使用它会导致不确定的结果。问题是两个或多个线程可能会遇到错误,所有错误都会导致设置相同的错误号。在这种情况下,一个线程可能已经被另一个线程更新后,最终检查errno。 为了避免产生不确定性,POSIX.1c将errno重新定义为可以访问每个线程错误号的服务,如下所示(ISO / IEC 9945:1-1996,§2.4): 某些函数可能在通过符号errno访问的变量中提供错误号。errno符号是通过包括C标准所指定的标头定义的。对于进程的每个线程,errno的值均不受其他线程对函数的调用或对errno的分配的影响。
在POSIX.1中,errno被定义为外部全局变量。但是,此定义在多线程环境中是不可接受的,因为使用它会导致不确定的结果。问题是两个或多个线程可能会遇到错误,所有错误都会导致设置相同的错误号。在这种情况下,一个线程可能已经被另一个线程更新后,最终检查errno。
为了避免产生不确定性,POSIX.1c将errno重新定义为可以访问每个线程错误号的服务,如下所示(ISO / IEC 9945:1-1996,§2.4):
某些函数可能在通过符号errno访问的变量中提供错误号。errno符号是通过包括C标准所指定的标头定义的。对于进程的每个线程,errno的值均不受其他线程对函数的调用或对errno的分配的影响。
另请参阅http://linux.die.net/man/3/errno
errno是线程本地的;在一个线程中设置它不会影响在其他任何线程中的值。