免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9575 | 回复: 12
打印 上一主题 下一主题

errno是如何实现线程安全的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-23 11:57 |只看该作者 |倒序浏览
在errno.h中
定义_MT后, errno被定义为 (*_errno())   , _errno定义为int * _errno(void);
但是不知道是具体如何实现线程安全的?

论坛徽章:
0
2 [报告]
发表于 2007-08-23 12:10 |只看该作者
我也不知道,如果让你做你会怎么做这个函数?

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
3 [报告]
发表于 2007-08-23 12:10 |只看该作者
好象是TLS实现的。好象XEN还不完全支持TLS。

论坛徽章:
0
4 [报告]
发表于 2007-08-23 12:16 |只看该作者
线程管理会对每个线程有一个结构,就像我们能根据FILE来找到fd一样。
只是这个结构和线程一一对应了

论坛徽章:
0
5 [报告]
发表于 2007-08-23 12:20 |只看该作者
可以找个实现来看看

static inline pthread_descr thread_self (void)
{
#ifdef THREAD_SELF
  return THREAD_SELF;
#else
  char *sp = CURRENT_STACK_FRAME;
#ifdef __ARCH_HAS_MMU__
  if (sp >= __pthread_initial_thread_bos)
    return &__pthread_initial_thread;
  else if (sp >= __pthread_manager_thread_bos
           && sp < __pthread_manager_thread_tos)
    return &__pthread_manager_thread;
  else if (__pthread_nonstandard_stacks)
    return __pthread_find_self();
  else
    return (pthread_descr)(((unsigned long)sp | (STACK_SIZE-1))+1) - 1












int * __errno_location()
{
    pthread_descr self = thread_self();
    return THREAD_GETMEM (self, p_errnop);
}


它根据线程栈的位置来找self,因为栈的位置共享整个进程地址空间,所以不同的线程是可以区分的。
线程id也一样可以,不知道为什么没有用

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2007-08-23 12:29 |只看该作者
我的理解:
多线程情况下,每个线程有自己的私有数据errno。
通过int * _errno(void)这个函数能把该线程的errno变量
取出来。

论坛徽章:
0
7 [报告]
发表于 2007-08-23 12:33 |只看该作者
是呀,我也是这么想,最笨的方法可以这样

int error[MAX_THREADS];
然后用线程的id(或者起它)去区别索引就可以了

论坛徽章:
0
8 [报告]
发表于 2007-08-23 12:44 |只看该作者
是TLS。

论坛徽章:
0
9 [报告]
发表于 2007-08-23 14:17 |只看该作者
菜鸟问:TLS是啥东西?

论坛徽章:
0
10 [报告]
发表于 2007-08-25 17:18 |只看该作者
errno不是全局变量, 就是使用线程私有数据实现线程安全的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP