可能在pthread_create中的丢失记录中丢失

时间:2012-10-05 22:40:58

标签: c++ memory pthreads

我的程序失败,检测到堆栈粉碎,而且我从Valgring获得的唯一消息是“块可能在丢失记录中丢失”三次重复,并且  我不知道该怎么解决。

==3726== 144 bytes in 1 blocks are possibly lost in loss record 74 of 87
==3726==    at 0x4025315: calloc (vg_replace_malloc.c:467)
==3726==    by 0x4010CD7: allocate_dtv (dl-tls.c:300)
==3726==    by 0x401146B: _dl_allocate_tls (dl-tls.c:464)
==3726==    by 0x40405C6: pthread_create@@GLIBC_2.1 (allocatestack.c:570)
==3726==    by 0x806BF36: Thread::Thread(void* (*)(void*), void*) (os.cpp:203)

这是代码,Valgrind是pthread_create调用。

Thread::Thread( PFUNC func, void * arg )
{
    int s = pthread_create( &_ThreadId, NULL, func, arg);  //here is msg from valgrind

    if (s != 0)
            throw EXCEPT_NOTHREAD;

    pthread_detach( _ThreadId ); 

}

请问你能帮我解决Thread功能有什么问题吗?我读过其他类似的问题,pthread_detach必须在创建一个线程之前? 非常感谢。

1 个答案:

答案 0 :(得分:3)

  

请问你能帮我解决Thread函数的错误吗?

这样没有“错误”;它只是在程序结束之前没有释放线程的资源,Valgrind将此报告为内存泄漏。由于您已分离线程,因此在线程终止之前不会释放其资源。如果它没有在程序之前终止,那么它们可能会被报告为泄露。

  

我读过其他类似的问题,pthread_detach必须在创建线程之前?

您不需要使用pthread_detach;这用于使线程负责释放自己的资源。如果你不使用它,那么另一个线程需要在停止线程时调用pthread_join

如果你想清理泄漏,那么你必须保持线程句柄(我猜你已经在做,假设_ThreadId是一个成员变量),而不是分离线程。 )。然后,在程序结束之前,告诉线程停止然后调用pthread_join等待它并释放其所有资源。删除(可能是无害的)警告是否值得为此做出麻烦取决于您,但干净关闭可能有助于避免更严重的潜在问题。

顺便说一句,你不应该使用像_ThreadId这样的名字,后跟一个大写字母;这样的名字是保留的。