Great suggestion, but unfortunately I am running this program either on Linux or Windows - I guess I could use a different signal for Linux, but it will not work for Windows.
Create a set of shared variables to maintain the child processes state and time of last update (like a watchdog). Then periodically wake up your main loop, and check for any thread whose last update time is too long whose state is not "DONE"....