找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 7795|回复: 6

[求助]使用ACE_TASK,main函数退出时程序崩溃

[复制链接]
发表于 2012-8-31 00:52:18 | 显示全部楼层 |阅读模式
用ACE_Task<ACE_MT_SYNCH>写的一个简单的多线程程序,main函数在退出时程序崩溃,但不是每次都奔溃,时不时这样,为什么?
gdb core文件,bt信息如下:
#0  0x00000035d0407aa8 in pthread_join () from /lib64/libpthread.so.0
#1  0x00000035d312e50a in ACE_5_6_1::ACE_Thread_Manager::wait(ACE_5_6_1::ACE_Time_Value const*, bool, bool) () from /usr/lib64/ACE-5.6.1/libACE.so.5.6.1
#2  0x00000035d312e5e9 in ACE_5_6_1::ACE_Thread_Manager::close() () from /usr/lib64/ACE-5.6.1/libACE.so.5.6.1
#3  0x00000035d312e860 in ACE_5_6_1::ACE_Thread_Manager::close_singleton() () from /usr/lib64/ACE-5.6.1/libACE.so.5.6.1
#4  0x00000035d30f9a0a in ACE_5_6_1::ACE_Object_Manager::fini() () from /usr/lib64/ACE-5.6.1/libACE.so.5.6.1
#5  0x00000035d30f9b18 in ACE_5_6_1::ACE_Object_Manager::~ACE_Object_Manager() () from /usr/lib64/ACE-5.6.1/libACE.so.5.6.1
#6  0x00000035d30f9d03 in ACE_5_6_1::ACE_Object_Manager_Manager::~ACE_Object_Manager_Manager() () from /usr/lib64/ACE-5.6.1/libACE.so.5.6.1
困扰了好几天了,百思不得其解,有没有高人指点下呀,小女子不胜感激!

代码大致如下
class Mytask: public ACE_Task<ACE_MT_SYNCH>{
    public:
        Mytask(int num):m_num(0),m_stop(false),_thr_count(num){
            size_t queue_size=1024;
            req_queue_.high_water_mark(queue_size*sizeof(iovec));
            req_queue_.low_water_mark(queue_size*sizeof(iovec)/3);
            init();
            open();
        }
        ~Mytask(){
            for (int i=0;i<_thr_count;i++)
                delete []_stack;
            delete []_stack;
            delete []_stack_size;
        }
        int init(){
            water_marks(ACE_IO_Cntl_Msg::SET_HWM,1000);
            return 0;
        }
        int open(){
            _stack_size = new size_t[_thr_count];
            _stack = new char*[_thr_count];
            for(int i=0;i<_thr_count;i++){
                _stack = new char[2*1024*1024];
                _stack_size = 2*1024*1024;
            }   
            int ret = activate(THR_NEW_LWP | THR_JOINABLE | THR_INHERIT_SCHED, _thr_count,0,ACE_DEFAULT_THREAD_PRIORITY,-1,0,0,(void**)_stack,_stack_size);
            return ret;
        }   
        int stop(){
            m_stop = true;
            req_queue_.deactivate();
            req_queue_.close();
            fprintf(stderr,"at stop() end\n");
            return 0;
        }   
int svc(){
            while(!m_stop){
                fprintf(stderr,"%d\n",m_num);
                m_num++;
            }
            fprintf(stderr,"at end of svc(),m_num=%d\n",m_num);
            return 0;
        }
        int  m_num;
        bool m_stop;
        int _thr_count;
    protected:
        ACE_Message_Queue_Ex<iovec, ACE_MT_SYNCH> req_queue_;
        char **_stack;
        size_t *_stack_size;
};

int main(int argc, char * argv[])
{
    Mytask mytask(3);
    sleep(2);
    mytask.stop();
    mytask.wait();
    fprintf(stderr,"at end of main,m_num=%d\n",mytask.m_num);
    return 0;
}
发表于 2012-9-3 01:27:24 | 显示全部楼层
你的分配内存和释放内存...应该有错误....内存有泄露哦....
  int open(){
            _stack_size = new size_t[_thr_count];
            _stack = new char*[_thr_count];
            for(int i=0;i<_thr_count;i++){
                _stack = new char[2*1024*1024];
                _stack_size = 2*1024*1024;
            }
这里分配了很多次内存,而_stack只记录了最后一分配的...我想你应该在for循环里
_stack[i] = new char[2*1024*1024]
_stack_size[i] = 2*1024*1024

在析构函数中的...回收时也是一样的错误应该是delete [] _stack[i]

我想你的崩溃是由于释放了多次同一地址的内存引起的
 楼主| 发表于 2012-9-3 22:34:20 | 显示全部楼层
baisaichen 发表于 2012-9-3 01:27
你的分配内存和释放内存...应该有错误....内存有泄露哦....
  int open(){
            _stack_size = new  ...

原代码是对的,有的,不知怎么贴上来就没了~
 楼主| 发表于 2012-9-3 22:35:40 | 显示全部楼层
starry 发表于 2012-9-3 22:34
原代码是对的,有的,不知怎么贴上来就没了~

我发现了 原来半角[i]打不出来,刚回复就是这样
发表于 2012-9-4 12:45:50 | 显示全部楼层
starry 发表于 2012-9-3 22:35
我发现了 原来半角[i]打不出来,刚回复就是这样

没有啊...我上面的就是半角的啊........
而且你的代码的改过来后...运行没有错啊...而且我运行了1000次
不知道你是什么情况下才有错的
发表于 2012-11-15 06:02:57 | 显示全部楼层
"nt ret = activate(THR_NEW_LWP | THR_JOINABLE | THR_INHERIT_SCHED, _thr_count,0,ACE_DEFAULT_THREAD_PRIORITY,-1,0,0,(void**)_stack,_stack_size);"
Are you sure what are you doing here?
activate(THR_NEW_LWP | THR_JOINABLE | THR_INHERIT_SCHED, _thr_count);
will do it.
发表于 2013-2-11 23:42:26 | 显示全部楼层
没看见你调用ACE::init()和ACE::fini()啊!估计是这个经典错误吧!
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-4-29 10:22 , Processed in 0.138824 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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