утечка памяти при использовании pthread_cancel () - PullRequest
2 голосов
/ 25 мая 2011

всем привет У меня есть вопрос о потоках, если, например, у меня есть какой-то поток 1, который выделяет часть памяти, а другой поток (предположим, 2) уничтожает поток 1 с помощью pthread_cancel () или просто используя return что происходит с миром памяти, который он выделил? будет утечка, если поток 1 не освободил этот кусок памяти? заранее спасибо за любой ответ

изм

просто чтобы прояснить это, как я знаю pthread_cancel() убивает поток, но что происходит с его памятью, когда я его убиваю? В случае return весь поток будет мертв, если 1 является основным потоком

Ответы [ 2 ]

7 голосов
/ 25 мая 2011

Да, в этом случае произойдет утечка памяти. C не имеет никакой сборки мусора - если вы выделите память и не сможете ее освободить, она будет утечка, простая и понятная.

Если вы хотите избежать утечки памяти, не звоните pthread_cancel. Сделайте так, чтобы ваши потоки грациозно выходили, установив флаг, запрашивающий их выход, а затем, когда они обнаружат, что этот флаг установлен, они могут освободить свою память и убить себя, возвращаясь из своих процедур потока или вызывая pthread_exit.

В качестве альтернативы, вы можете установить обработчик очистки потока, вызвав pthread_cleanup_push, который будет вызываться, когда ваш поток завершается или отменяется при вызове pthread_cancel. Вы можете использовать функцию-обработчик, которая освободит любую выделенную память, которая у вас есть.

2 голосов
/ 25 мая 2011

Прежде всего, будет ли он отменен немедленно или нет, зависит от состояния отмены. пожалуйста, проверьте "pthread_setcancelstate" и "pthread_setcanceltype". Также важно иметь обработчик после отмены потока. В обработчике все ресурсы должны быть освобождены, такие как блокировки и память, это похоже на возврат. Так что, да, есть вероятность утечки, если реализация не право. Я предлагаю посмотреть на реализацию метода или функции перед его использованием. Надеюсь, это поможет.

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