LINUX.ORG.RU

pthread — leaks ????


0

0

Есть два объекта cServer & cClient class сServer { .... cClient** clis; pthread_t thaccept; pthread_mutex_t mxkey; int cliadd(int sd); int clidel(cClient* p); unsigned long count; .... protect: static void* waitforaccept(void* p); .... } class cClient { ...... void* parent; pthread_t thread; ....... private: static void* socketread(void* p); ....... }

cClient::cClient { ..... pthread_create(&thread,0,sockread,(void*)this); pthread_detach(thread); ..... }

static void* cClient::socketread(void* p) { ... pthread_setcanceltype(PTHREAD_CANCEL_ASYNCTONOUS,0); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,0); int sd=((cClient*)p)->getsocket(); char buf[65535]; while(1) { memset(buf,0,65535); if(recv(sd,buf,65535,0)==-1) { ((cServer*)(((cClient*)p)->getparent()))->clidel((cClient*)p); return (void*)0; } ...... } } //cliadd организован так же cServer::clidel(cClient* p) { pthread_mutex_lock(&mxkey); for(int i=0;i<cli_count;i++) { if(p==clis[i]) { delete clis[i]; for(i;i<cli_count;) { clis[i]=clis[++i]; } clis[--cli_count]=0; cClient** tmp=NULL; tmp=(cClient**)realoc(clis,cli_count*sizeof(cClient*)); if((tmp!=clis)&&(tmp!=NULL)) { clis=tmp; } } } pthread_mutex_unlock(&mxkey); } так вот после чего mcheck показывает что в realoc при уничтожении образуется неосвобожденая память и незакрыты дискриптор нити которая вызывает уничтожение объекта, хотя в деструкторе есть проверка и уничтожение потока pthread_kill;pthread_cancel;pthread_join Вот в чем вопрос, ето что realoc c нитями такое дают ???

anonymous

Опссс сори Есть два объекта cServer & cClient <br>class сServer <br>{ <br>.... <br> cClient** clis; <br> pthread_t thaccept; <br> pthread_mutex_t mxkey; <br> int cliadd(int sd); <br> int clidel(cClient* p); <br> unsigned long count; <br>.... <br>protect: <br>static void* waitforaccept(void* p); <br>.... <br>} <br>class cClient <br>{ <br>...... <br> void* parent; <br> pthread_t thread; <br>....... <br>private: <br> static void* socketread(void* p); <br>....... <br>} <br> <br>cClient::cClient <br>{ <br>..... <br> pthread_create(&thread,0,sockread,(void*)this); <br> pthread_detach(thread); <br>..... <br>} <br> <br>static void* cClient::socketread(void* p) <br>{ <br>... <br> pthread_setcanceltype(PTHREAD_CANCEL_ASYNCTONOUS,0); <br> pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,0); <br> int sd=((cClient*)p)->getsocket(); <br> char buf[65535]; <br>while(1) <br> { <br> memset(buf,0,65535); <br> if(recv(sd,buf,65535,0)==-1) <br> { <br> ((cServer*)(((cClient*)p)->getparent()))->clidel(cClient*)p); <br> return (void*)0; <br> } <br> ...... <br> } <br>} <br>//cliadd организован так же <br>cServer::clidel(cClient* p) <br>{ <br> pthread_mutex_lock(&mxkey); <br> for(int i=0;i<cli_count;i++) <br> { <br> if(p==clis[i]) <br> { <br> delete clis[i]; <br> for(i;i<cli_count;) <br> { <br> clis[i]=clis[++i]; <br> } <br> clis[--cli_count]=0; <br> cClient** tmp=NULL; <br> tmp=(cClient**)realoc(clis,cli_count*sizeof<br>(cClient*)); <br> if((tmp!=clis)&&(tmp!=NULL)) <br> { <br> clis=tmp; <br> } <br> } <br> } <br> pthread_mutex_unlock(&mxkey); <br>} так вот после чего mcheck показывает что в realoc при уничтожении образуется неосвобожденая память и незакрыты дискриптор нити которая вызывает уничтожение объекта, хотя в деструкторе есть проверка и уничтожение потока pthread_kill;pthread_cancel;pthread_join Вот в чем вопрос, ето что realoc c нитями такое дают ???

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.