找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 9078|回复: 9

跪求啊!!!!!!

  [复制链接]
发表于 2011-5-21 20:57:04 | 显示全部楼层 |阅读模式
我写了个小程序,主要生成一个线程接收一个前台服务器的消息,入队,然后再生成多个处理线程,取消息并对客户进行转发,根据ACE_hash_map<id,connect_handler>进行转发。 主线程运行run_even_handler,主要进行接收连接以及监听连接消息。
现在出现以下问题, 当某个客户连接断开时,主线程调用handle_input.,进行一系列连接关闭处理。但此时处理线程可能正在调用此连接connect_handler的发送函数,此时就出现内容读写错误,异常。经我测试此时处理线程调用任何此connect_handler的函数都出现访问冲突。貌似vc++对对象有内存保护。(PS:我这代码在linux下面就能正常运行)!
大神,求教啊!困扰我几天了!!!!!!!!
发表于 2011-5-22 00:31:23 | 显示全部楼层
可能跟OS对线程调度有差别有关。感觉这是线程同步问题导致。你访问的对象没有做好同步措施,自己仔细检查一下。
 楼主| 发表于 2011-5-22 08:52:43 | 显示全部楼层
回复 2# winston


    我感觉也是,关键是怎么样同步啊,我在连接的对象connect_handler里面加个锁,可是连锁的访问都出现访问冲突,异常。
发表于 2011-5-22 09:11:08 | 显示全部楼层
这种问题,追加引用计数器。在发送和接收数据的过正中,计数器+1,用完计数器-1,当关闭的时候,计数器-1,当计数器是0的时候删除对象。
这样就行了。
 楼主| 发表于 2011-5-22 12:06:34 | 显示全部楼层
回复 4# freeeyes


    我加计数器了,关键是连计数器都无法访问啊!
 楼主| 发表于 2011-5-22 20:11:52 | 显示全部楼层
回复 5# nono436


    任何此对象的函数都不能调用
发表于 2011-5-23 00:50:38 | 显示全部楼层
那应该是对象被破坏了。问题可能不出在这里!
 楼主| 发表于 2011-5-23 12:21:39 | 显示全部楼层
我就很迷茫。我的多个处理线程都能调用此对象的发送函数,但一旦对面连接断开,我的主线程就调用对象的handle_input(),如果handle_input返回0,没事,一旦返回-1;处理线程就不能调用此对象的任何函数,都是访问冲突!
发表于 2011-5-23 14:21:13 | 显示全部楼层
回复 3# nono436


   对象被破坏,可能不是这里的问题了。这种问题不好找,最好用工具帮忙!
发表于 2011-5-26 22:59:38 | 显示全部楼层
你看看哪里把那个对象delete掉的,然后分析下是不是提前delete对象了,如果你添加了引用计数,那就不能再直接delete对象而只应该将引用计数减一了,仔细检查下,应该就是对象被提前删除了
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 16:10 , Processed in 0.027834 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表