pthread_created之后是pthread_join valgrind可能会丢失c

时间:2019-01-30 08:14:38

标签: c memory-leaks valgrind

我遇到有关丢失内存的valgrind错误的问题。 这是我的代码:

if((err = pthread_create(&handlert, NULL, &handler, NULL)) != 0) perror(..)

if((err = pthread_create(&mastert , NULL, &createmaster, NULL)) != 0) perror(..)

for(int i = 0; i < THREADSINPOOL; i++) {
    if((err = pthread_create(&(f[i]), NULL, &createpool, NULL)) != 0) perror(..)
}

if((err = pthread_join(handlert,(void*) &sRet[1])) != 0) perror(..)

if((err = pthread_join(mastert,(void*) &lRet[1])) != 0) perror(..)

for(int i = 0; i < THREADSINPOOL; i++) {
    if((err = pthread_join(f[i], (void*) &wRet[i])) != 0) perror(..)
}
return 0;

我为每个线程联接,我正在检查结果,但是valgrind仍然说:

==21610== 560 bytes in 1 blocks are possibly lost in loss record 8 of 12
==21610==    at 0x4C2CC90: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==21610==    by 0x4012E44: allocate_dtv (dl-tls.c:296)
==21610==    by 0x4012E44: _dl_allocate_tls (dl-tls.c:460)
==21610==    by 0x4E3FCC0: allocate_stack (allocatestack.c:589)
==21610==    by 0x4E3FCC0: pthread_create@@GLIBC_2.2.5 (pthread_create.c:495)
==21610==    by 0x401B3B: main (myfile.c:85)

(对于每个创建pthread的错误,仅更改代码行) 预先谢谢你!

编辑: 编译中的标志:--leak-check = full -std = c99 -Wall -pedantic -g -DMAKE_VALGRIND_HAPPY 只有一个错误(看起来好像不是先前错误的结果)

1 个答案:

答案 0 :(得分:2)

我不认为这是真正的泄漏,或者如果它是低级代码中最有可能的泄漏。如果将其视为泄漏或急切的优化,则值得商

请参见http://sourceware.org/ml/glibc-bugs/2007-04/msg00036.html

  

这不是真正的泄漏。据我所知分配在缓冲区   pthread_create()用于扩展线程堆栈。   如果再次使用pthread_join()和pthread_create(),则旧位置   堆栈将由新堆栈使用。

https://stackoverflow.com/a/17642468/714501

中也提到了这一点。
  

POSIX线程的某些实现(我猜您正在使用glibc / NPTL)缓存并重用线程资源,而不是完全释放它们。

我认为在这种情况下,您可以安装valgrind抑制器:

http://valgrind.org/docs/manual/mc-manual.html#mc-manual.suppfiles