免费注册 查看新帖 |

Chinaunix

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

[C++] 求助:自定义的结构体在新线程中引用异常,谢谢! [复制链接]

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-22 16:23 |只看该作者 |倒序浏览
定义了一个全局的 结构体:

#define MAXDATASIZE 1024
typedef struct _CLIENT
{
    int fd;                     //客户端socket描述符
    char name[32];              //客户端名称
    struct sockaddr_in addr;    //客户端地址信息结构体
    char data[MAXDATASIZE];     //客户端私有数据指针
} CLIENT;

在.cpp文件函数里:
CLIENT client[FD_SETSIZE];
程序运行正常。


然后,在另一个程序里,包含了这个结构体定义,但在一个由新线程调用的函数中时,build正常,运行时报错:Thread2:EXC_BAD_ACCESS(code=1,address=0x...)

何故??

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2015-02-22 19:38 |只看该作者
1.  结构体没有全局不全局之说
2.  CLIENT client[FD_SETSIZE]; 是全局变量么, 不是在栈上的吧?

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
3 [报告]
发表于 2015-02-23 19:27 来自手机 |只看该作者
CLIENT client[FD_SETSIZE]; 是在函数内定义,非全局。
源cpp单独运行正常。

将源cpp的main改名通过线程创建函数调用就运行报错。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2015-02-23 20:13 |只看该作者
CLIENT client[FD_SETSIZE]; 是在函数内定义

这个就是原因。。。。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
5 [报告]
发表于 2015-02-24 00:34 |只看该作者
回复 4# folklore


那怎么办?非要将这个 声明为 全局的才行??

缘何在CPP里单独可以,而用线程创建函数调用就不行呢?(不好意思,这里的知识我不懂,请教得啰嗦了点。)

   

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
6 [报告]
发表于 2015-02-24 00:42 |只看该作者
folklore 发表于 2015-02-23 20:13
CLIENT client[FD_SETSIZE]; 是在函数内定义

这个就是原因。。。。


根据你的指导,我将  CLIENT client[FD_SETSIZE];    放到函数体外 声明为全局,即正常了。


这就奇怪了,为什么调试程序时(非多线程),在CPP里,定义在主函数里,程序正常运行;

合并到工程时,用线程函数调用它,就得改为全局定义才行呢??

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
7 [报告]
发表于 2015-02-24 09:35 |只看该作者
回复 6# mini_peng
局部变量(堆栈)是函数临时私有的。 不能在另一个线程使用(如果不同步的话)。
所以要new 或全局变量,
一定要用局部变量,
或是主线程要等待副线程Copy完再执行。 或是主线程要等待副线程结束。
   

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:56:11操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
8 [报告]
发表于 2015-02-24 21:17 |只看该作者
回复 7# folklore

谢谢。

我第一次调试线程函数,里面的套路还不明白。所以觉得为何在单独的程序里可以执行,但到了线程中就不行了。

谢谢指导。


   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
9 [报告]
发表于 2015-02-25 08:46 |只看该作者
貌似sizeof(client)太大了超出栈大小所致

论坛徽章:
208
巨蟹座
日期:2013-09-02 09:16:36卯兔
日期:2013-09-02 20:53:59酉鸡
日期:2013-09-05 21:21:45戌狗
日期:2013-10-15 20:51:17寅虎
日期:2013-10-18 21:13:16白羊座
日期:2013-10-23 21:15:19午马
日期:2013-10-25 21:22:48技术图书徽章
日期:2013-11-01 09:11:32双鱼座
日期:2013-11-01 20:29:44丑牛
日期:2013-11-01 20:40:00卯兔
日期:2013-11-11 09:21:32酉鸡
日期:2013-12-04 19:56:39
10 [报告]
发表于 2015-02-25 09:26 |只看该作者
hellioncu 发表于 2015-02-25 08:46
貌似sizeof(client)太大了超出栈大小所致

不太像,大概在64K左右,不算大
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP