小编典典

errno 是线程安全的吗?

all

errno.h中,这个变量被声明为extern int errno;所以我的问题是,errno在一些调用后检查值是否安全或在多线程代码中使用
perror() 是否安全。这是一个线程安全变量吗?如果没有,那还有什么替代方案?

我在 x86 架构上使用带有 gcc 的 linux。


阅读 142

收藏
2022-06-28

共1个答案

小编典典

是的,它是线程安全的。在 Linux 上,全局 errno 变量是线程特定的。POSIX 要求 errno 是线程安全的。

http://www.unix.org/whitepapers/reentrant.html

在 POSIX.1 中,errno
被定义为外部全局变量。但是这个定义在多线程环境中是不可接受的,因为它的使用会导致不确定的结果。问题是两个或多个线程可能会遇到错误,都会导致设置相同的
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 是线程本地的;在一个线程中设置它不会影响它在任何其他线程中的值。

2022-06-28