MSDN mentions that “When a thread terminates, the thread object attains a signaled state, satisfying any threads that were waiting on the object”.

So, you can check for whether a thread has terminated by checking the state of the thread handle – whether it’s signaled or not:

DWORD result = WaitForSingleObject( hThread, 0);

if (result == WAIT_OBJECT_0) {
    // the thread handle is signaled - the thread has terminated
else {
    // the thread handle is not signaled - the thread is still alive