跪求啊!!!!!!
我写了个小程序,主要生成一个线程接收一个前台服务器的消息,入队,然后再生成多个处理线程,取消息并对客户进行转发,根据ACE_hash_map<id,connect_handler>进行转发。 主线程运行run_even_handler,主要进行接收连接以及监听连接消息。现在出现以下问题, 当某个客户连接断开时,主线程调用handle_input.,进行一系列连接关闭处理。但此时处理线程可能正在调用此连接connect_handler的发送函数,此时就出现内容读写错误,异常。经我测试此时处理线程调用任何此connect_handler的函数都出现访问冲突。貌似vc++对对象有内存保护。(PS:我这代码在linux下面就能正常运行)!
大神,求教啊!困扰我几天了!!!!!!!! 可能跟OS对线程调度有差别有关。感觉这是线程同步问题导致。你访问的对象没有做好同步措施,自己仔细检查一下。 回复 2# winston
我感觉也是,关键是怎么样同步啊,我在连接的对象connect_handler里面加个锁,可是连锁的访问都出现访问冲突,异常。 这种问题,追加引用计数器。在发送和接收数据的过正中,计数器+1,用完计数器-1,当关闭的时候,计数器-1,当计数器是0的时候删除对象。
这样就行了。 回复 4# freeeyes
我加计数器了,关键是连计数器都无法访问啊! 回复 5# nono436
任何此对象的函数都不能调用 那应该是对象被破坏了。问题可能不出在这里! 我就很迷茫。我的多个处理线程都能调用此对象的发送函数,但一旦对面连接断开,我的主线程就调用对象的handle_input(),如果handle_input返回0,没事,一旦返回-1;处理线程就不能调用此对象的任何函数,都是访问冲突! 回复 3# nono436
对象被破坏,可能不是这里的问题了。这种问题不好找,最好用工具帮忙! 你看看哪里把那个对象delete掉的,然后分析下是不是提前delete对象了,如果你添加了引用计数,那就不能再直接delete对象而只应该将引用计数减一了,仔细检查下,应该就是对象被提前删除了
页:
[1]