The reason is related to a possible race condition with the suspend count.
The suspend count is incremented by a call to SuspendThread(), and is
decremented by a call to ResumeThread(). If the suspend count is non-zero,
then the scheduler will mark the thread as "waiting" (or not ready), and
will not schedule the thread for processing; conversely, when the suspend
count is exactly zero, the thread is marked as "ready" and is given
processing time. The race condition occurs because
access to the suspend
count is not synchronized between threads, such that it is possible for one
thread to decrement the suspend count beyond zero to a value of -1. At that
value, the thread will never be scheduled for processing.