за pthread_created следует pthread_join valgrind возможная потеря c - PullRequest
0 голосов
/ 30 января 2019

У меня проблема с ошибками 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 голосов
/ 30 января 2019

Я не думаю, что это настоящая утечка или, скорее всего, в низкоуровневом коде.И это спорно, если это следует рассматривать как утечку или нетерпеливые оптимизации.

1002 * См 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

...