关于windows核心编程中事件对象和线程的疑问。该如何处理

关于windows核心编程中事件对象和线程的疑问。
//   Create   a   global   handle   to   a   manual-reset,   nonsignaled   event.
HANDLE   g_hEvent;
int   WINAPI   WinMain(...)  
{
      //Create   the   manual-reset,   nonsignaled   event.
      g_hEvent   =   CreateEvent(NULL,   TRUE,   FALSE,   NULL);
      //Spawn   3   new   threads.
      HANDLE   hThread[3];
      DWORD   dwThreadID;
      hThread[0]   =   _beginthreadex(NULL,   0,   WordCount,   NULL,   0,   &dwThreadID);
      hThread[1]   =   _beginthreadex(NULL,   0,   SpellCheck,   NULL,   0,   &dwThreadID);
      hThread[2]   =   _beginthreadex(NULL,   0,   GrammarCheck,   NULL,   0,   &dwThreadID);
①   OpenFileAndReadContentsIntoMemory(...);
      //Allow   all   3   threads   to   access   the   memory.
②   SetEvent(g_hEvent);
      ...
}
③DWORD   WINAPI   WordCount(PVOID   pvParam)
{
      //Wait   until   the   file 's   data   is   in   memory.
      WaitForSingleObject(g_hEvent,   INFINITE);
      //Access   the   memory   block.
      ...
      return(0);
}
④DWORD   WINAPI   SpellCheck(PVOID   pvParam)
{
      //Wait   until   the   file 's   data   is   in   memory.
      WaitForSingleObject(g_hEvent,   INFINITE);
      //Access   the   memory   block.
      ...
      return(0);
}
⑤DWORD   WINAPI   GrammarCheck(PVOID   pvParam)
{
      //Wait   until   the   file 's   data   is   in   memory.
      WaitForSingleObject(g_hEvent,   INFINITE);
      //Access   the   memory   block.
      ...
      return(0);
}

1.在上面的1处,已经把数据读入,才在2处用SetEvent发出事件通知,为什么3,4,5线程还要用WaitForSingleObject等待数据读入.
2.这三个线程同时进入可调度状态,他们之间有没有先后顺序(那个线程先执行,那个后执行),如果他们没有先后顺序,我怎样控制他们有先后顺序地执行。


------解决方案--------------------
1。当然要等待,因为①
是在hThread[0] = _beginthreadex(NULL, 0, WordCount, NULL, 0, &dwThreadID);
hThread[1] = _beginthreadex(NULL, 0, SpellCheck, NULL, 0, &dwThreadID);
hThread[2] = _beginthreadex(NULL, 0, GrammarCheck, NULL, 0, &dwThreadID);
之后执行的,这些线程产生之后就有可能会在①之前被调用,这时数据还没有呢?
2。同样的,这三个线程产生,实际上整个进程就含有4个线程了,这4个线程的执行顺序是完全随机的,同时也没有办法来控制它。除非用内核对象来让一些线程等待。
------解决方案--------------------
你等待的都是一个事件句柄,你可以使用多个事件句柄,在触发时按顺序就行了。

还可以用SetThreadPriority