Already "dead" threads can be reaped with pthread_join, if they are not set to detached.
And yes, you should not cancel a dead thread, it will return an error.
If the sessions are blocking on a read() they should be at a cancellation point, no problem.
Are you invoking any kind of cleanup -- pthread_cleanup_push & pop? Are you leaving malloc'd memory...