免费注册 查看新帖 |

Chinaunix

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

给线程传递参数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-22 19:16 |只看该作者 |倒序浏览
下面程序向一个线程传递参数 aa
传递前后的值不一致,是什么原因?
谢谢!

代码:
        site.host = "192.168.1.30";
        site.port = 7000;
        aa.sites = &site;
        aa.dbenv = db_env;
        aa.home = "/usr/local/database/data/dbfile/";
        aa.progname = "dbsrvd";
        aa.machtab = machtab[db_no];

        if ((ret = pthread_create(&all_thr[db_no], NULL, connect_all, &aa)) != 0){


传递前aa的值为:
(gdb) p aa
$9 = {dbenv = 0x84e1858,
          progname = 0x805e600 "dbsrvd",
          home = 0x805e420 "/usr/local/database/data/dbfile/",
          machtab = 0x8451840,
          sites = 0xbffea690, nsites = 2}
(gdb) p aa.sites->port
$10 = 7000
(gdb) p aa.sites->host
$11 = 0x805e618 "192.168.1.30"

传递后aa的值为:
(gdb) p *aa
$30 = {dbenv = 0x8523e48,
            progname = 0x805e420 "/usr/local/database/data/dbfile/",
            home = 0x4f041 <Address 0x4f041 out of bounds>,
            machtab = 0x1ff, sites = 0xbffea690, nsites = 2}
(gdb) p sites->port
$31 = 3221224196
(gdb) p sites->host
$32 = 0x8523e48 ""

[ 本帖最后由 xyhost 于 2006-9-22 19:19 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-09-22 19:29 |只看该作者
大概你的 aa 是局部变量吧。局部变量在函数结束后就无效了,所以在线程函数里肯定是不行的。

把 aa 改成从堆分配,然后在线程函数里删除。

论坛徽章:
0
3 [报告]
发表于 2006-09-22 19:37 |只看该作者
原帖由 BenBear 于 2006-9-22 19:29 发表

把 aa 改成从堆分配,然后在线程函数里删除。


非常感谢您的回复,
关于如何定义aa能 给个例子吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP