В принципе TerminateThread() вполне корректно убивает поток (с точки зрения системы) если поток в это время не активен.
Вообще-то, TerminateThread() не рекомендуется использовать абы где, т.к. поток она убивает не вполне корректно (в частности, при этом не оповещаются DLL, загруженные в адр.пр-во процесса, не освобождаются некоторые системные ресурсы). Как написано в MSND, использовать ее следует только в
исключительных обстоятельствах.
AiK, вообще завершение потока возможно 2 способами: 1) его ThreadProc() завершила свою работу, вызвав return или ExitThread(); 2) поток извне 'попросили' завершиться (например, с помощью TerminateThread). Во втором случае корректная схема должна быть такая: перед созданием потока создаем объект
событие (см. CreateEvent), устанавливаем его в несигнальное состояние, посылаем его хэндл 4-м параметром в CreateThread и отслеживаем его состояние с помощью WaitForSingleObject: если состояние сигнальное, вызываем ExitThread. Конечно, по завершении потока его хэндл должен быть освобожден вызовом CloseHandle().
Еще одно замечание: если в потоковой процедуре будут использоваться CRT функции, следует создавать/завершать поток с помощью _beginthreadex()/_endthread().