Ошибки утечки памяти при использовании pthread_create - PullRequest
19 голосов
/ 10 апреля 2011

Я пишу программу с использованием библиотеки pthread. Когда я запускаю свою программу с командой valgrind --leak-check = full, я получаю следующее описание ошибки:

==11784==  
==11784== **HEAP SUMMARY:**  
==11784==     in use at exit: 4,952 bytes in 18 blocks  
==11784==   total heap usage: 1,059 allocs, 1,041 frees, 51,864 bytes allocated  
==11784==  
==11784== **288 bytes** in 1 blocks are possibly lost in loss record 2 of 3  
==11784==    at 0x4C2380C: calloc (vg_replace_malloc.c:467)  
==11784==    by 0x4010D2E: _dl_allocate_tls (dl-tls.c:300)  
==11784==    by 0x55DC218: **pthread_create**@@GLIBC_2.2.5 (allocatestack.c:570)  
==11784==    by 0x401BC0: initdevice(char*) (in /a/fr-01/vol/home/stud/lim/workspace  /Ex3/l)  
==11784==    by 0x406D05: main (in /a/fr-01/vol/home/stud/lim/workspace/Ex3/l)  
==11784==  
==11784== **4,608 bytes** in 16 blocks are possibly lost in loss record 3 of 3  
==11784==    at 0x4C2380C: calloc (vg_replace_malloc.c:467)  
==11784==    by 0x4010D2E: _dl_allocate_tls (dl-tls.c:300)  
==11784==    by 0x55DC218: **pthread_create**@@GLIBC_2.2.5 (allocatestack.c:570)    
==11784==    by 0x40268F: write2device(char*, int) (in /a/fr-01/vol/home/stud/lim/workspace/Ex3/l)  
==11784==    by 0x406D7B: main (in /a/fr-01/vol/home/stud/lim/workspace/Ex3/l)  
==11784==  
==11784== **LEAK SUMMARY:**  
==11784==    definitely lost: 0 bytes in 0 blocks  
==11784==    indirectly lost: 0 bytes in 0 blocks  
==11784==      possibly lost: 4,896 bytes in 17 blocks  
==11784==    still reachable: 56 bytes in 1 blocks  
==11784==         suppressed: 0 bytes in 0 blocks  
==11784== Reachable blocks (those to which a pointer was found) are not shown.  
==11784== To see them, rerun with: --leak-check=full --show-reachable=yes  
==11784==  
==11784== For counts of detected and suppressed errors, rerun with: -v  
==11784== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 4 from 4)  

Каждый раз, когда я вызываю pthread_create с определенной функцией - я вызываю функцию pthread_exit в конце функции. Итак, после проверки это не проблема, в чем может быть проблема?

Ответы [ 5 ]

33 голосов
/ 10 апреля 2011

Ресурсы потока не освобождаются сразу после завершения, если только поток не был создан с атрибутом detach state, установленным в PTHREAD_CREATE_DETACHED, или если pthread_detach вызывается для его pthread_t.

AnНеподключенный поток будет оставаться в завершенном состоянии до тех пор, пока его идентификатор не будет передан pthread_join или pthread_detach.

. Чтобы подвести итог, у вас есть три варианта:

  1. создать поток с отсоединеннымнабор атрибутов (атрибут PTHREAD_CREATE_DETACHED)
  2. Отсоединение потока после создания (путем вызова pthread_detach) или
  3. Присоединение к завершенным потокам для их утилизации (путем вызова pthread_join).

Hth.

4 голосов
/ 11 января 2015

когда не работает с присоединяемыми потоками, выходящий поток должен вызвать pthread_detach(pthread_self()), чтобы освободить все свои ресурсы.

3 голосов
/ 10 апреля 2011

Ot вы можете сделать поток в отдельном состоянии , чтобы избежать утечки памяти, если поток не должен быть присоединен (или просто истекает сам по себе)

Чтобы явно создатьДля потока, который можно присоединить или отделить, используется аргумент attr в подпрограмме pthread_create ().Типичный четырехэтапный процесс:

  • Объявление переменной атрибута pthread типа данных pthread_attr_t
  • Инициализация переменной атрибута с помощью pthread_attr_init ()
  • Setстатус атрибута отключен с помощью pthread_attr_setdetachstate ()
  • Когда это будет сделано, освободите библиотечные ресурсы, используемые атрибутом с помощью pthread_attr_destroy ()
0 голосов
/ 27 июля 2016

Обратите внимание, что стандартное поведение pthread_create является "присоединяемым", НЕ ОБНАРУЖЕНО. Поэтому некоторые ресурсы ОС по-прежнему будут оставаться в процессе после завершения pthread, что приведет к pthread-зомби и увеличит использование виртуальной / резидентной памяти.

Четыре упомянутых решения @sehe решат эту проблему.

Однако, если ваша нить давно существует, это может быть не очень нужно. например, если pthread переживает всю жизнь процесса.

0 голосов
/ 06 января 2014

В дополнение к правильным ответам, данным вам другими пользователями, я предлагаю вам прочитать это:

Отслеживание утечки памяти в многопоточном приложении C

...