Журналируй работу программы, выясняй, как она себя ведёт, и где останавливается.
Кроме того, я бы посоветовал сделать иначе - вызывай accept() в цикле в главном потоке, а новые потоки создавай только тогда, когда клиент подключится, и передавай им сокет клиента как параметр. Тогда не понадобится костыль с is_last_thread_busy.