This article is from the Threads Programming FAQ, by Bryan O'Sullivan firstname.lastname@example.org with numerous contributions by others.
By default, threads are created non-detached. You need to perform a
join on each non-detached thread, or else storage will never be freed
up when they exit. As an alternative, you can create detached threads,
for which storage will be freed as soon as they exit. This latter
approach is generally better; you shouldn't create non-detached
threads unless you explicitly need to know when or if they exit.