Memory leaks when using pthead_exit() to exit thread

耗尽温柔 提交于 2020-01-03 04:14:09

问题


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;
}


来源:https://stackoverflow.com/questions/17369442/memory-leaks-when-using-pthead-exit-to-exit-thread

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