Не освобождает должным образом темы в C - PullRequest
0 голосов
/ 24 декабря 2018

Я делаю программу на C, которая использует threads, которую я никогда не узнаю, когда они закончат, поэтому я использую pthread_detach() для освобождения этой памяти, верно?

Вот код:

pthread_t thread_id_Gruder, thread_id_Tavish;

estado_threadGruder = pthread_create(&thread_id_Gruder,NULL,SERVER_McGruderDedicado,&td_Gruder);

estado_threadTavish = pthread_create(&thread_id_Tavish,NULL,SERVER_McTavishDedicado,&td_Tavish);

if (estado_threadGruder != 0 || estado_threadTavish != 0) {
            if (estado_threadGruder != 0) MSSG_error(THREAD_ERROR, "McGruder");
            else MSSG_error(THREAD_ERROR, "McTavish");
            raise(SIGINT);
            pause();
}
pthread_detach(thread_id_Gruder);
pthread_detach(thread_id_Tavish);

Но когда я использую valgrind для проверки утечек памяти, я нашел такой вывод:

HEAP SUMMARY:
==19426==     in use at exit: 544 bytes in 2 blocks
==19426==   total heap usage: 15 allocs, 13 frees, 628 bytes allocated
==19426== 
==19426== Thread 1:
==19426== 272 bytes in 1 blocks are possibly lost in loss record 1 of 2
==19426==    at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==19426==    by 0x40134A6: allocate_dtv (dl-tls.c:286)
==19426==    by 0x40134A6: _dl_allocate_tls (dl-tls.c:530)
==19426==    by 0x4E44227: allocate_stack (allocatestack.c:627)
==19426==    by 0x4E44227: pthread_create@@GLIBC_2.2.5 (pthread_create.c:644)
==19426==    by 0x1097AA: main (in /users/home/alumnes/LS//PRACTICA/Lionel-S/Lionel)
==19426== 
==19426== 272 bytes in 1 blocks are possibly lost in loss record 2 of 2
==19426==    at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==19426==    by 0x40134A6: allocate_dtv (dl-tls.c:286)
==19426==    by 0x40134A6: _dl_allocate_tls (dl-tls.c:530)
==19426==    by 0x4E44227: allocate_stack (allocatestack.c:627)
==19426==    by 0x4E44227: pthread_create@@GLIBC_2.2.5 (pthread_create.c:644)
==19426==    by 0x1097CC: main (in /users/home/alumnes/LS//PRACTICA/Lionel-S/Lionel)
==19426== 
==19426== LEAK SUMMARY:
==19426==    definitely lost: 0 bytes in 0 blocks
==19426==    indirectly lost: 0 bytes in 0 blocks
==19426==      possibly lost: 544 bytes in 2 blocks
==19426==    still reachable: 0 bytes in 0 blocks
==19426==         suppressed: 0 bytes in 0 blocks
==19426== 
==19426== For counts of detected and suppressed errors, rerun with: -v
==19426== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)

Я пытался запустить код без функции phtread_detach(), но valgrindпоказывает ту же утечку памяти, поэтому я предполагаю, что я не отсоединяю должным образом ...

Правильно ли я отсоединяю потоки или, возможно, проблема в моих потоках?

Спасибо.

1 Ответ

0 голосов
/ 24 декабря 2018

Проблема, скорее всего, в ваших темах.Даже если вы не использовали внутри них malloc.

Вот что происходит, когда вы создаете поток с помощью pthread_create, библиотека выделяет кучу вещей для правильной работы потока и начинает работатьЭто.Обычно эти вещи освобождаются только тогда, когда эти потоки объединяются с использованием pthread_join.Однако в некоторых случаях в вашем коде нет точки, где вы хотите синхронизировать потоки, а просто хотите, чтобы их не было, когда они закончили.Вот почему есть pthread_detach.Отсоединенная нить очистится, как только начнет функционировать returns.Обратите внимание, что когда они возвращают .

Если ваши потоки не завершили работу после завершения программы, ваша основная функция завершится нормально, но ваши потоки все еще работают.Поскольку они еще не вернулись, они все еще не убраны.

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

Если у ваших потоков бесконечные циклы, я рекомендую создать переменную should_Terminate, которая начинается с 0, и сделать ваши циклы в потоках разрывными, если ее значение равно 1Затем вы устанавливаете его на 1, когда хотите завершить свою программу, и используете pthread_join, чтобы дождаться, пока потоки завершат свою работу корректно.

Если у них нет бесконечных циклов, и они обязательно вернутсяв какой-то момент достаточно просто присоединиться к ним в конце программы.

...