Strictly speaking, I wasn't storing the thread handles in a hash, I was wanting to use them as keys. This is because I wanted to associate information for each thread (i.e. the parameters used when started). Using the tid() method solved that problem.
I'm unsure that your code for joining the threads is useful to me, as it seems that it would wait for the first thread to finish before checking any others. Since some of the threads may hang, this would not solve my stated problem. I do agree that using a sleep loop isn't optimal, and I should look for a better way to wait for threads to exit.