免费注册 查看新帖 |

Chinaunix

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

关于linux线程的pthread_exit函数调用的问题 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-20 17:15 |只看该作者 |倒序浏览
大家好,我在学习linux的线程编程时对线程的退出函数pthread_exit的调用参数的使用感到迷惑,敬请大家帮忙解惑。

pthread_exit(void *val); 根据aupe介绍,avl是线程退出时,退出码所保存的地方,因此在调用此函数时,之前应该有一个变量比如int var,然后

pthread_exit((void *)&val);

这样即可从val中获得线程退出码,这个似乎比较好理解,下面请看如下调用:


pthread_exit((void *)0);

上面这句调用我就反应不过来了,因为这里0是一个常数,被转型为void 类型指针,那么似乎表示返回码放在0这个地址处,但是aupe中的例子运行后的结果表示返回码就是0,我昏了,对比如下:

return((void *)0); 此时表示线程返回状态码是0,这个可以理解。 难道pthread_exit的调用参数是常数时,难道也这样理解?

论坛徽章:
0
2 [报告]
发表于 2009-10-20 17:18 |只看该作者
pthread_exit(NULL) 好理解吗?
pthread_exit((void *) 0)跟这个是一个意思。

[ 本帖最后由 weichongli 于 2009-10-20 17:23 编辑 ]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
3 [报告]
发表于 2009-10-20 17:32 |只看该作者

回复 #2 weichongli 的帖子

根据aupe,pthread_exit((void *)2); 于是通过pthread_join所得到的返回值就是2,所以我还是不明白呢?能否再阐述下,谢谢!

论坛徽章:
0
4 [报告]
发表于 2009-10-20 17:34 |只看该作者
pthread_exit()传递的值由发起调用的线程使用pthread_join()来接收。
pthread_exit((void *)&val);
看着别扭,

如果val本身是函数内部一个局部变量,那么用这种方式来传递值并不妥当,因为线程结束了,函数退出了,局部变量不在了。

论坛徽章:
0
5 [报告]
发表于 2009-10-20 17:36 |只看该作者
void * 通常就是用来传递 “一个字长 任意类型” 的数据, 它未必就是一个指针。
有些时候也会用unsigned long之类的来表达同样的意思, 也不能简单认为它就是长整型数,它也可能是一个指针。

一些数据结构或函数接口会定义这样的void*(或unsigned long),供使用者附加任意类型的数据。 这些数据的类型只有使用者自己知道。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
6 [报告]
发表于 2009-10-20 17:46 |只看该作者

回复 #4 weichongli 的帖子

aupe中代码大体这样的:
main()
{
   void *tret;
  ...
  pthread_join(tid2, &tret);  ===> 于是(int)tret的值就是2  ...
}

void *run(void *args)
{
    pthread_exit((void *)2);  ===> 如果是return((void *)2),则tret为2好理解
}
--------------
请问weichongli,为啥是2?再次感谢!

[ 本帖最后由 jiufei19 于 2009-10-20 17:47 编辑 ]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
7 [报告]
发表于 2009-10-20 17:48 |只看该作者

回复 #5 kouu 的帖子

谢谢kouu,能就我的问题具体指出我的困惑吗?

论坛徽章:
0
8 [报告]
发表于 2009-10-20 17:53 |只看该作者
原帖由 jiufei19 于 2009-10-20 17:32 发表
根据aupe,pthread_exit((void *)2); 于是通过pthread_join所得到的返回值就是2,所以我还是不明白呢?能否再阐述下,谢谢!



(void *)2 本质上是一个内存地址(虽然地址也是整数或长整数)。个人认为这种用法算是一种使用技巧(或者说是一种剑走偏锋的用法)。

我觉得这样

struct x {
       int a;
       int b;
       char *str;
};

struct x *value = malloc(sizeof(struct x));
memset(value, 0, sizeof(struct x));

x->a = 10;
x->b = 20;
x->str = strdup("This is result from thread.");

pthread_exit(x);

----------------------
在发起调用的线程处
通过
struct x *ret;
pthread_join(tid, &ret);
printf("%d, %d, %s\n", ret->a, ret->b, ret->str);

才是pthread_exit()/pthread_join()的主要用法(虽然实际应用中我们通常只回传一个整数)

[ 本帖最后由 weichongli 于 2009-10-20 17:55 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-10-20 17:55 |只看该作者
原帖由 jiufei19 于 2009-10-20 17:48 发表
谢谢kouu,能就我的问题具体指出我的困惑吗?


你传递的是2,拿到的不就是2么?

不要被void*这个类型迷惑了,void*在这里表示任意类型,那么你把它当成int吧~

pthread_exit(2);

int tret;
pthread_join(tid2, &tret);

tret == 2 不很正常么?

论坛徽章:
0
10 [报告]
发表于 2009-10-20 17:58 |只看该作者
原帖由 jiufei19 于 2009-10-20 17:46 发表
aupe中代码大体这样的:
main()
{
   void *tret;
  ...
  pthread_join(tid2, &tret);  ===> 于是(int)tret的值就是2  ...
}

void *run(void *args)
{
    pthread_exit((void *)2);  ===> 如果是 ...


3楼写的是就是(void *) 2 呗

另外弱问一句:aupe是啥?盼复

[ 本帖最后由 weichongli 于 2009-10-20 18:01 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP