Привет, ЛОР!
Написал некую программу на C, в ней достаточно активно используются треды. Жизнь треда начинается через pthread_create и заканчивается через pthread_cancel. Через pthread_attr функции pthread_create сообщается тип треда (JOINABLE или DETACHED). Вся динамически выделенная память освобождается в функции, назначенной треду через pthread_cleanup_push/pop.
После прогона программы под Valgrind выяснилось следующее:
* Если тред создан как JOINABLE (в этом случае после cancel вызывается join), то остаются possibly lost куски памяти, по одному на каждый созданный тред.
* Если тред создан как DETACHED (в этом случае после create дополнительно вызывается detach) вся память освобождается корректно.
Если верить man-у, то и join и detach освобождают все ресурсы, выделенные при создании треда.
В интернетах эту тему обсуждали в 2006-8 годах, некоторые предлагали вызывать detach после join и наоборот, но это попахивает бредом. Единого мнения я не нашел. Некоторые, кстати, считают, что на подобные утечки можно просто забить - дескать, все так и должно работать. Так ли это?
P.S.
Все это безобразие происходит под Ubuntu 9.10 x86