C语言多线程中使用errno全局变量的问题

        在C语言中,不管理Unix/Linux还是Windows下,每次系统调用或库函数调用后,如果判断返回值不对,需要调用errno全局变量来判断具体错误。既然errno是全局变量,那么如果在多线程函数中它不会被别的线程充掉吗?显然不是,通过查看相关定义,仅以Unix/Linux为例,可以得出两个结论:
1. errno是per-thread的,也就是说errno定义和存储是对于线程而言的,与别的线程毫无关系;
2. errno调用最终是一个调用,每使用一次都会调用一次函数。
与错误处理相关的两个函数perror,strerror内部调用的也都是线程存储的变量,看看FreeBSD中对strerror的定义:
char*
strerror(int err)
{
   static char msg[32];
   int i;
   for(i=0;errtab[i].msg !=NULL;i++)
    if(errtab[i].err == err)
       return (errtab[i].msg);
   sprintf(msg,"unknown error (%d)",err);
}

errtab数组是定义的本线程的全局变量。

Linux中实现的细节可参看以下文章,讲得比较透彻:
https://blog.csdn.net/weixin_35695879/article/details/89530417

发布了64 篇原创文章 · 获赞 19 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/ComputerInBook/article/details/103762115