Почему несвязанные pthreads пропускают ресурсы, если поток не отсоединен после pthread_create

Я взял пример с

https://www.kernel.org/doc/man-pages/online/pages/man3/pthread_create.3.html

заставил его работать бесконечно (с небольшим сном, поэтому использование ЦП не является узким местом, поэтому нет очереди потоков), создавая потоки с pthread_create без вызова pthread_join. Это вызывает утечку памяти, и в конечном итоге на ПК заканчивается память. Когда я добавил pthread_detach сразу после создания потока, программа ведет себя хорошо, и через некоторое время использование памяти остается постоянным.

У меня сложилось впечатление, что при выходе из потока (при закрытии } функции, если она задана pthread_create), все его ресурсы очищаются.


person NoSenseEtAl    schedule 13.12.2012    source источник


Ответы (1)


У меня сложилось впечатление, что когда поток завершает работу (при закрытии } функции, если она передана pthread_create), все его ресурсы очищаются.

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

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

Многие реализации сохраняют это возвращаемое значение в стеке потока и, таким образом, сохраняют весь стек до тех пор, пока кто-нибудь не вызовет pthread_join в неотсоединенном потоке.

person nos    schedule 13.12.2012