在多线程中errno定义如下extern int *__errno_location()define errno (*__errno_location ())第一行是声明一个函数__errno_location,返回整形指针,参数没有,第二行是什么意思,没有看明白,定义errno为什么?请教达人只有20分,全送了,谢谢其实我知道是返回一个地址,主要是那个语法,怎么那么写?
2 回答
江户川乱折腾
TA贡献1851条经验 获得超5个赞
errno实际上,并不是我们通常认为的是个整型数值,而是通过整型指针来获取值的。这个整型就是线程安全的。
另外,宏之所以这样实现,是因为标准库规定了必须能够通过&errno方式取得保存错误代码的变量的地址,因此 __errno_location()函数的返回值是指针,并把宏定义为解引用函数返回的地址*__errno_location()。如果 __errno_location直接返回int类型,此时就无法取得保存错误代码的变量的地址。
开心每一天1111
TA贡献1836条经验 获得超13个赞
使用TLS
多线程运行库
首先,errno必须成为各个线程的私有成员。在glibc中,errno被定义为一个宏,如下:
#define errno (*__errno_location ())
函数__errno_location在不同的库版本下有不同的定义,在单线程版本中,它仅直接返回了全局变量errno的地址。而在多线程版本中,不同线程调用__errno_location返回的地址则各不相同。在MSVC中,errno同样是一个宏,其实现方式和glibc类似。
添加回答
举报
0/150
提交
取消
