gpt4 book ai didi

c - 未在 C 中正确释放线程

转载 作者:太空狗 更新时间:2023-10-29 16:10:07 26 4
gpt4 key购买 nike

我正在用 C 编写一个使用 threads 的程序,我永远不知道它们何时结束,所以我正在使用 pthread_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)

我尝试在没有 phtread_detach() 函数的情况下运行代码,但是 valgrind 显示相同的内存泄漏,所以我假设我没有正确分离。 .

我是否正确地分离了线程,或者问题可能出在我的线程中?

谢谢。

最佳答案

问题很可能是您的线程。即使您没有在其中使用任何 malloc

事情是这样的,当您使用 pthread_create 创建线程时,库会为线程的正确操作分配一堆东西,并开始运行它。通常,这些东西只有在使用 pthread_join 加入这些线程时才会被释放。但是,在某些情况下,在您的代码中没有必要同步线程,而只是希望它们在完成后消失。这就是为什么有 pthread_detach 的原因。一旦函数 返回,分离的线程就会自行清除。请注意,当他们返回时。

如果程序结束时您的线程还没有结束,您的主函数将正常结束,但您的线程仍在运行。由于他们还没有回来,所以还没有收拾干净。

如果您打算让这些线程一直运行到程序完成,或者想在程序结束时等待它们没有完成,那么您确实有一点要同步它们(程序结束)和 pthread_detach可能不是要走的路。

如果您的线程有无限循环,我建议创建一个变量 should_Terminate,它以 0 开头,如果它的值为 1,则让您的线程中的循环中断。然后当您将它设置为 1 时想终止您的程序,并使用 pthread_join 等待线程优雅地结束它们的工作。

如果他们没有无限循环,并且肯定会在某个时候返回,那么在程序结束时加入他们就足够了。

关于c - 未在 C 中正确释放线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53915364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com