const int THREADS_COUNT = 10;
HANDLE start;

unsigned __stdcall proc(void*)
{
::WaitForSingleObject(start, INFINITE);
return 0;
}

int main(int argc, char* argv[])
{
start = ::CreateEvent(NULL, FALSE, FALSE, NULL);
assert( start );
HANDLE threads[THREADS_COUNT] = {0};
int i;

for(i = 0; i < THREADS_COUNT; ++i) {
threads[i] = reinterpret_cast<HANDLE>(_beginthreadex(0, 0, proc, (void*)i, 0, 0));
assert( threads[i] );
}

::Sleep(10000);
for(i = 0; i < THREADS_COUNT; ++i) {
::SetEvent(start);
::Sleep(0); // <---------- ここ
}

for(i = 0; i < THREADS_COUNT; ++i) {
::WaitForSingleObject(threads[i], INFINITE);
::CloseHandle(threads[i]);
}