утечка памяти при использовании нескольких отдельных потоков в C - PullRequest
0 голосов
/ 28 ноября 2011

Я создаю сервер, который создает отдельный поток каждый раз, когда клиент подключается к серверу.

    TRACE(DETAILED_TRACE,("Entered infinite loop of server.\n"));
    printf("\nThread counter = %d\n", thread_counter);
    printf("Waiting for connection...\n");

    len=sizeof(cliaddr);

    connfd=accept(sd,(struct sockaddr*)&cliaddr,&len);
    if (connfd < 0)
    {
        if (errno == EINTR)
            printf("Interrupted system call ??");
        else
            error_exit(SYSTEM_ERROR, "Connection");
    }
    if(FLAG_UNSET == server_stop_flag)
    {
        printf("Connection from %s\n",
               inet_ntop(AF_INET,&cliaddr.sin_addr,buf,sizeof(buf)));

        thread_return = pthread_create((th+thread_counter), NULL
                                       ,thread_func,(void*)&connfd);
        if(thread_return)
        {
            error_exit(SYSTEM_ERROR, "Thread Creation");
        }
        else
        {
            thread_return = pthread_detach(th[thread_counter
                                               ]);
            if(thread_return)
            {
                printf("\nError code: %d\n", thread_retu
                       rn);
                error_exit(SYSTEM_ERROR, "Detatch error"
                    );
            }
        }
        thread_counter++;
        thread_counter = thread_counter%MAX_THREADS;

во время работы с valgrind я получаю следующее:

===================================================================
16 bytes in 1 blocks are still reachable in loss record 1 of 2
   at 0x1B905301: calloc (vg_replace_malloc.c:176)
   by 0x9E7364: _dlerror_run (in /lib/libdl-2.3.4.so)
   by 0x9E6E3B: dlsym (in /lib/libdl-2.3.4.so)
   by 0x1B9106EE: open (vg_libpthread.c:2339)

LEAK SUMMARY:
   definitely lost: 0 bytes in 0 blocks.
   possibly lost:   0 bytes in 0 blocks.
   still reachable: 16 bytes in 1 blocks.
===============================================================

Я получаю одно и то же резюме утечек независимо от того, сколько потоков создано. Так как файл, в котором находится утечка, является системным файлом, а не моим, я реализовал что-то правильно. Что бы это могло быть?

Я запустил тот же файл в valgrind на другом сервере Linux, теперь я получаю это:

==12599== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 1)
==12599== malloc/free: in use at exit: 136 bytes in 1 blocks.
==12599== malloc/free: 6 allocs, 5 frees, 184 bytes allocated.
==12599== For counts of detected errors, rerun with: -v
==12599== searching for pointers to 1 not-freed blocks.
==12599== checked 10,580,680 bytes.
==12599==
==12599== 136 bytes in 1 blocks are possibly lost in loss record 1 of 1
==12599==    at 0x4905D27: calloc (vg_replace_malloc.c:279)
==12599==    by 0x358500D332: _dl_allocate_tls (in /lib64/ld-2.3.4.so)
==12599==    by 0x3585F066EE: pthread_create@@GLIBC_2.2.5 (in /lib64/tls/libpthr
ead-2.3.4.so)
==12599==    by 0x401222: main (test36.c:81)
==12599==
==12599== LEAK SUMMARY:
==12599==    definitely lost: 0 bytes in 0 blocks.
==12599==      possibly lost: 136 bytes in 1 blocks.
==12599==    still reachable: 0 bytes in 0 blocks.
==12599==         suppressed: 0 bytes in 0 blocks.

Это проблема с сервером? К вашему сведению: строка № 81 в test.c - это вызов pthread_create. что-то не так с моим вызовом создания?

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Что-то попалось на глаза, когда я посмотрел на это:

    thread_return = pthread_create((th+thread_counter), NULL
                                   ,thread_func,(void*)&connfd);

Он передает адрес connfd другому потоку.Как было выделено connfd?Это не локальная переменная?

2 голосов
/ 28 ноября 2011

Не думаю, что вам есть о чем беспокоиться.В сводке утечек говорится:

LEAK SUMMARY:
definitely lost: 0 bytes in 0 blocks.
possibly lost: 0 bytes in 0 blocks.
still reachable: 16 bytes in 1 blocks.

и «все еще достижимая» память не была окончательно потеряна, и, похоже, она присутствует в системном коде, как вы идентифицируете, и не увеличивается с числом потоков, всеиз которых в моей книге «не о чем беспокоиться».

Если объем памяти резко не увеличится или вы не сможете определить, как ваш код может вытекать из памяти, потратьте свое время на другие проблемыи не этот.

0 голосов
/ 28 ноября 2011

Это просто означает, что вы не освободили всю выделенную память до завершения вашей программы.Освободите все ваши указатели на alloc, и это предупреждение должно исчезнуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...