Memory leaks when using pthead_exit() to exit thread

匿名 (未验证) 提交于 2019-12-03 01:36:02

问题:

I have a problem when use pthread_exit() to exit .My code is like this:

{     ...     pthread_attr_t attr;     iRetValue = pthread_attr_init(&attr);     iRetValue = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);     size_t nStackSize = 4 * 1024 * 1024;     iRetValue = pthread_attr_setstacksize(&attr, nStackSize);     while(condition)     {         ...         int32 iSockId = cServSocket.accept();         if(iSockId < 0)         {              continue;         }           pthread_t tid;         int32* pSockId = new int(iSockId);         iRetValue = pthread_create(&tid, &attr, run_thread, (void*)pSockId);         ...     }     ...     pthread_attr_destroy(&attr); }  void* run_thread(void* p) {     int32 iSockId = *(int32*)p;     if(p != NULL){delete p}     int32 iRetValue = g_dealMgr.deal_thread(iSockId);      return (void*)iRetValue; } int32 CDealMgr::deal_thread(int32 iSocket) {     ...   // many temporarydata create,expect will release autoly     pthread_exit((void*)1);     return 0; }  

In fact, it causes memory leaks,and when I move pthread_exit((void*)1); to run_thread,like this

void* run_thread(void* p) {     int32 iSockId = *(int32*)p;     if(p != NULL){delete p}     int32 iRetValue = g_dealMgr.deal_thread(iSockId);     pthread_exit((void*)1);     return (void*)iRetValue; } int32 CDealMgr::deal_thread(int32 iSocket) {     ...   // many temporary data create,expect will release autoly     return 0; } 

memory leaks disappear. Now, my question is, why pthread_exit() used in the function run_thread() called will cause memory leaks ,hope someone can help me,thank you very much.

回答1:

The problem is that in C++ return causes the stack to be unwound and local variables to be destroyed. Calling pthread_exit() is only guaranteed to invoke cancellation handlers registered with pthread_cancel_push(). You need to return normally from deal_thread to ensure all variables declared on its stack are properly destroyed.

Once you call pthread_exit the thread stops running - it does not return from deal_thread (or even continue executing it). You don't need to call pthread_exit explicitely, the same thing happens when you return from run_thread.

This:

void* run_thread(void* p) {     pthread_exit((void*)1); } 

is equivalent to this:

void* run_thread(void* p) {     return (void*)1; } 

Check out the paragraph about implicit call to pthread_exit() here.

Also note there is the possibility of a crash in run_thread if you call it with NULL. You should change the first 2 lines to:

int32 iSockId = 0; if (p != NULL) {     iSockId = *(int32*)p;     delete p; } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!