在C中未正确释放线程

在C中未正确释放线程,c,multithreading,valgrind,C,Multithreading,Valgrind,我正在用C语言编写一个程序,它使用线程,我永远不知道它们何时完成,所以我使用pthread\u detach()来释放内存,对吗 代码如下: pthread_t thread_id_Gruder, thread_id_Tavish; estado_threadGruder = pthread_create(&thread_id_Gruder,NULL,SERVER_McGruderDedicado,&td_Gruder); estado_threadTavish = pthr

我正在用C语言编写一个程序,它使用
线程
,我永远不知道它们何时完成,所以我使用
pthread\u detach()
来释放内存,对吗

代码如下:

pthread_t thread_id_Gruder, thread_id_Tavish;

estado_threadGruder = pthread_create(&thread_id_Gruder,NULL,SERVER_McGruderDedicado,&td_Gruder);

estado_threadTavish = pthread_create(&thread_id_Tavish,NULL,SERVER_McTavishDedicado,&td_Tavish);

if (estado_threadGruder != 0 || estado_threadTavish != 0) {
            if (estado_threadGruder != 0) MSSG_error(THREAD_ERROR, "McGruder");
            else MSSG_error(THREAD_ERROR, "McTavish");
            raise(SIGINT);
            pause();
}
pthread_detach(thread_id_Gruder);
pthread_detach(thread_id_Tavish);
但当我使用
valgrind
检查内存泄漏时,我发现以下输出:

HEAP SUMMARY:
==19426==     in use at exit: 544 bytes in 2 blocks
==19426==   total heap usage: 15 allocs, 13 frees, 628 bytes allocated
==19426== 
==19426== Thread 1:
==19426== 272 bytes in 1 blocks are possibly lost in loss record 1 of 2
==19426==    at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==19426==    by 0x40134A6: allocate_dtv (dl-tls.c:286)
==19426==    by 0x40134A6: _dl_allocate_tls (dl-tls.c:530)
==19426==    by 0x4E44227: allocate_stack (allocatestack.c:627)
==19426==    by 0x4E44227: pthread_create@@GLIBC_2.2.5 (pthread_create.c:644)
==19426==    by 0x1097AA: main (in /users/home/alumnes/LS//PRACTICA/Lionel-S/Lionel)
==19426== 
==19426== 272 bytes in 1 blocks are possibly lost in loss record 2 of 2
==19426==    at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==19426==    by 0x40134A6: allocate_dtv (dl-tls.c:286)
==19426==    by 0x40134A6: _dl_allocate_tls (dl-tls.c:530)
==19426==    by 0x4E44227: allocate_stack (allocatestack.c:627)
==19426==    by 0x4E44227: pthread_create@@GLIBC_2.2.5 (pthread_create.c:644)
==19426==    by 0x1097CC: main (in /users/home/alumnes/LS//PRACTICA/Lionel-S/Lionel)
==19426== 
==19426== LEAK SUMMARY:
==19426==    definitely lost: 0 bytes in 0 blocks
==19426==    indirectly lost: 0 bytes in 0 blocks
==19426==      possibly lost: 544 bytes in 2 blocks
==19426==    still reachable: 0 bytes in 0 blocks
==19426==         suppressed: 0 bytes in 0 blocks
==19426== 
==19426== For counts of detected and suppressed errors, rerun with: -v
==19426== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
我试图在没有
phtrade\u detach()
函数的情况下运行代码,但是
valgrind
显示了相同的内存泄漏,因此我假设我没有正确地分离

我是否正确地分离了线程,或者问题出在线程内部


谢谢。

问题很可能是您的线程。即使您没有在它们内部使用任何
malloc

下面是使用pthread_create创建线程时发生的情况,库为线程的正确操作分配了一系列内容,并开始运行它。通常,只有在使用
pthread\u join
连接这些线程时,才会释放这些内容。然而,在某些情况下,您的代码中没有任何一点需要同步线程,而只是希望它们在同步完成后消失。这就是为什么会有
pthread\u detach
。分离的线程将在其函数
返回时立即清除自身。请注意,当它们返回时

如果程序完成时线程尚未完成,则主函数将正常结束,但线程仍在运行。因为他们还没有回来,所以还没有清理干净

如果您打算让这些线程一直运行到程序完成,或者希望在程序结束时等待它们不完成,那么您确实有一点需要同步它们(程序结束),pthread_detach可能不是方法

如果你的线程有无限循环,我建议设置一个变量
应该_Terminate
,它以0开头,如果它的值是1,那么让线程中的循环中断。然后,当您要终止程序时,将其设置为1,并使用
pthread\u join
等待线程优雅地结束其工作


如果它们没有无限循环,并且一定会在某个点返回,只在程序端连接它们就足够了。

问题在于线程函数,而不是它们的分离状态。@JonathanLeffler好的,谢谢,但在我的线程中,我没有做malloc…@HessianMad,线程的内存分配和释放行为是由线程函数决定的,您没有介绍这些函数。然而,通过Ctrl-C终止程序有时会在分配内存和取消分配内存之间捕获一个或多个线程,这是完全合理的。@JohnBollinger,但我不是在线程内分配内存……这种解释很有道理。这就是我所拥有的:线程中有一个无限循环。谢谢你的时间:)哦,我编辑了答案,因为我想我可能猜到了很多,哈哈。但我想我在新的答案中仍然涵盖了这个问题。很高兴帮忙,祝你好运!为了安全起见,我会把
设为应该终止的
全局原子标志或
bool
。阅读C11中的内容。观点很好!向它们添加
volatile
关键字就足够了,对吗?