C pthread_create导致内存泄漏

时间:2017-08-21 13:28:57

标签: c multithreading memory-leaks pthreads valgrind

我有一个使用可连接线程的多线程应用程序。 为了创建线程(总共nthreads个工作者+ 1个额外的线程),我使用pthread_create的常规调用。 但是,当我尝试调试内存泄漏时,由于x bytes in y blocks are possibly lost in loss record z of w调用导致pthread_create错误。

以下是与该问题相关的程序代码部分:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>

int main(){
   int i=0;
   int nthreads=8;

    pthread_t tid_w[nthreads+1]; 

    if( pthread_create(&tid_w[0], NULL, dispatcher, (void*) (size_t) i)<0){
        perror("Creating dispatcher thread");
        return -1;
    }

    for(i=1; i<nthreads+1; i++){
        if( pthread_create(&tid_w[i], NULL, worker, (void*) (size_t) i)<0){
            perror("Creating worker thread");
            return -1;
        }
    }

    // thread joining

    for(i=0; i<nthreads+1; i++){
        if( pthread_join(tid_w[i], NULL)<0){
             perror("Joining thread");
             return -1;
        }
    }

    return 0;
}

这是valgrind(3.11)

的输出
==14418== 
==14418== HEAP SUMMARY:
==14418==     in use at exit: 14,496 bytes in 21 blocks
==14418==   total heap usage: 25 allocs, 4 frees, 15,724 bytes allocated
==14418== 
==14418== 560 bytes in 1 blocks are possibly lost in loss record 12 of 14
==14418==    at 0x4C2DB95: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14418==    by 0x40134C4: allocate_dtv (dl-tls.c:322)
==14418==    by 0x40134C4: _dl_allocate_tls (dl-tls.c:544)
==14418==    by 0x4E400D2: allocate_stack (allocatestack.c:588)
==14418==    by 0x4E400D2: pthread_create@@GLIBC_2.2.5 (pthread_create.c:537)
==14418==    by 0x4018AE: main (chatty.c:132)
==14418== 
==14418== 4,480 bytes in 8 blocks are possibly lost in loss record 13 of 14
==14418==    at 0x4C2DB95: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14418==    by 0x40134C4: allocate_dtv (dl-tls.c:322)
==14418==    by 0x40134C4: _dl_allocate_tls (dl-tls.c:544)
==14418==    by 0x4E400D2: allocate_stack (allocatestack.c:588)
==14418==    by 0x4E400D2: pthread_create@@GLIBC_2.2.5 (pthread_create.c:537)
==14418==    by 0x401909: main (chatty.c:138)
==14418== 
==14418== LEAK SUMMARY:
==14418==    definitely lost: 0 bytes in 0 blocks
==14418==    indirectly lost: 0 bytes in 0 blocks
==14418==      possibly lost: 5,040 bytes in 9 blocks
==14418==    still reachable: 9,456 bytes in 12 blocks
==14418==         suppressed: 0 bytes in 0 blocks
==14418== Reachable blocks (those to which a pointer was found) are not shown.
==14418== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==14418== 
==14418== For counts of detected and suppressed errors, rerun with: -v
==14418== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

行号可能不匹配,因为我从代码中删除了一些与套接字相关的部分。

我也读过很多关于导致内存泄漏的pthread_create但是在使用分离线程时似乎问题就出现了,这不是我的情况。 有关如何解决问题的任何想法?

0 个答案:

没有答案