starry 发表于 2012-8-31 00:52:18

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

用ACE_Task<ACE_MT_SYNCH>写的一个简单的多线程程序,main函数在退出时程序崩溃,但不是每次都奔溃,时不时这样,为什么?
gdb core文件,bt信息如下:
#00x00000035d0407aa8 in pthread_join () from /lib64/libpthread.so.0
#10x00000035d312e50a 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
#20x00000035d312e5e9 in ACE_5_6_1::ACE_Thread_Manager::close() () from /usr/lib64/ACE-5.6.1/libACE.so.5.6.1
#30x00000035d312e860 in ACE_5_6_1::ACE_Thread_Manager::close_singleton() () from /usr/lib64/ACE-5.6.1/libACE.so.5.6.1
#40x00000035d30f9a0a in ACE_5_6_1::ACE_Object_Manager::fini() () from /usr/lib64/ACE-5.6.1/libACE.so.5.6.1
#50x00000035d30f9b18 in ACE_5_6_1::ACE_Object_Manager::~ACE_Object_Manager() () from /usr/lib64/ACE-5.6.1/libACE.so.5.6.1
#60x00000035d30f9d03 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;
            _stack = new char*;
            for(int i=0;i<_thr_count;i++){
                _stack = new char;
                _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;
      }
      intm_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;
}

baisaichen 发表于 2012-9-3 01:27:24

你的分配内存和释放内存...应该有错误....内存有泄露哦....
int open(){
            _stack_size = new size_t;
            _stack = new char*;
            for(int i=0;i<_thr_count;i++){
                _stack = new char;
                _stack_size = 2*1024*1024;
            }
这里分配了很多次内存,而_stack只记录了最后一分配的...我想你应该在for循环里
_stack = new char
_stack_size = 2*1024*1024

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

我想你的崩溃是由于释放了多次同一地址的内存引起的

starry 发表于 2012-9-3 22:34:20

baisaichen 发表于 2012-9-3 01:27 static/image/common/back.gif
你的分配内存和释放内存...应该有错误....内存有泄露哦....
int open(){
            _stack_size = new...

原代码是对的,有的,不知怎么贴上来就没了~

starry 发表于 2012-9-3 22:35:40

starry 发表于 2012-9-3 22:34 static/image/common/back.gif
原代码是对的,有的,不知怎么贴上来就没了~

我发现了 原来半角[i]打不出来,刚回复就是这样

baisaichen 发表于 2012-9-4 12:45:50

starry 发表于 2012-9-3 22:35 static/image/common/back.gif
我发现了 原来半角[i]打不出来,刚回复就是这样

没有啊...我上面的就是半角的啊........
而且你的代码的改过来后...运行没有错啊...而且我运行了1000次
不知道你是什么情况下才有错的

steven99ca 发表于 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.

nettoobad 发表于 2013-2-11 23:42:26

没看见你调用ACE::init()和ACE::fini()啊!估计是这个经典错误吧!
页: [1]
查看完整版本: [求助]使用ACE_TASK,main函数退出时程序崩溃