nono436 发表于 2011-5-21 20:57:04

跪求啊!!!!!!

我写了个小程序,主要生成一个线程接收一个前台服务器的消息,入队,然后再生成多个处理线程,取消息并对客户进行转发,根据ACE_hash_map<id,connect_handler>进行转发。 主线程运行run_even_handler,主要进行接收连接以及监听连接消息。
现在出现以下问题, 当某个客户连接断开时,主线程调用handle_input.,进行一系列连接关闭处理。但此时处理线程可能正在调用此连接connect_handler的发送函数,此时就出现内容读写错误,异常。经我测试此时处理线程调用任何此connect_handler的函数都出现访问冲突。貌似vc++对对象有内存保护。(PS:我这代码在linux下面就能正常运行)!
大神,求教啊!困扰我几天了!!!!!!!!

winston 发表于 2011-5-22 00:31:23

可能跟OS对线程调度有差别有关。感觉这是线程同步问题导致。你访问的对象没有做好同步措施,自己仔细检查一下。

nono436 发表于 2011-5-22 08:52:43

回复 2# winston


    我感觉也是,关键是怎么样同步啊,我在连接的对象connect_handler里面加个锁,可是连锁的访问都出现访问冲突,异常。

freeeyes 发表于 2011-5-22 09:11:08

这种问题,追加引用计数器。在发送和接收数据的过正中,计数器+1,用完计数器-1,当关闭的时候,计数器-1,当计数器是0的时候删除对象。
这样就行了。

nono436 发表于 2011-5-22 12:06:34

回复 4# freeeyes


    我加计数器了,关键是连计数器都无法访问啊!

nono436 发表于 2011-5-22 20:11:52

回复 5# nono436


    任何此对象的函数都不能调用

winston 发表于 2011-5-23 00:50:38

那应该是对象被破坏了。问题可能不出在这里!

nono436 发表于 2011-5-23 12:21:39

我就很迷茫。我的多个处理线程都能调用此对象的发送函数,但一旦对面连接断开,我的主线程就调用对象的handle_input(),如果handle_input返回0,没事,一旦返回-1;处理线程就不能调用此对象的任何函数,都是访问冲突!

winston 发表于 2011-5-23 14:21:13

回复 3# nono436


   对象被破坏,可能不是这里的问题了。这种问题不好找,最好用工具帮忙!

yoogera 发表于 2011-5-26 22:59:38

你看看哪里把那个对象delete掉的,然后分析下是不是提前delete对象了,如果你添加了引用计数,那就不能再直接delete对象而只应该将引用计数减一了,仔细检查下,应该就是对象被提前删除了
页: [1]
查看完整版本: 跪求啊!!!!!!