程序本意是产生5个线程,在5个线程里面同时等待一个人工重设Event,然后我在主线程中
用PulseEvent使这个Event变成有信号,按照MSDN上的说法,应该是
For a manual-reset event object, all waiting threads that can be released immediately are released. The function then resets the event object's state to nonsignaled and returns. 
那么就是说这5个线程都应该被激活,然而得到的结果却是只有4个线程被激活。我也用了其他的线程
数目做实验,每次总是最后一个线程无法激活。不知道是什么原因。
大家看看程序:
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;#define THREAD_NUM 5
HANDLE g_Event;
HANDLE event[THREAD_NUM];
DWORD WINAPI ThreadFunc(LPVOID);int main(int argc, char* argv[])
{
HANDLE hThrd[THREAD_NUM];
g_Event=::CreateEvent(NULL,TRUE,FALSE,NULL);
for (int i=0;i<THREAD_NUM;i++)
{
event[i]=::CreateEvent(NULL,TRUE,FALSE,NULL);
}
for (i=0;i<THREAD_NUM;i++)
{
hThrd[i]=::CreateThread(NULL,0,ThreadFunc,(LPVOID)i,0,NULL);
if (hThrd[i]!=NULL)
{
cout<<"Thread"<<i+1<<" Lauched"<<endl;
}
}
WaitForMultipleObjects(THREAD_NUM,event,TRUE,INFINITE);
PulseEvent(g_Event);
WaitForMultipleObjects(THREAD_NUM,hThrd,TRUE,INFINITE);
for (i=0;i<THREAD_NUM;i++)
{
CloseHandle(event[i]);
CloseHandle(hThrd[i]);
}
CloseHandle(g_Event);
cout<<"Process Finished"<<endl;
return 0;
}DWORD WINAPI ThreadFunc(LPVOID n)
{
SetEvent(event[(int)n]);
while (TRUE)
{
switch(WaitForSingleObject(g_Event,INFINITE))
{
case WAIT_OBJECT_0:
printf("Thread%d WAIT_OBJECT_0\n",(int)n+1);
return 0;
break;
default:
break;
}
}
return 0;
}
输出为:Thread1 Lauched
Thread2 Lauched
Thread3 Lauched
Thread4 Lauched
Thread5 Lauched
Thread1 WAIT_OBJECT_0
Thread2 WAIT_OBJECT_0
Thread3 WAIT_OBJECT_0
Thread4 WAIT_OBJECT_0请问是为什么?谢谢

解决方案 »

  1.   

    试了一下你的程序,PulseEvent(g_Event);前面加一个Sleep(100);就可以了。原因:执行PulseEvent(g_Event);时,最后一个线程SetEvent(event[(int)n]);完,但还没有执行到WaitForSingleObject。If no threads are waiting, or if no thread can be released immediately, PulseEvent simply sets the event object's state to nonsignaled and returns.
      

  2.   

    多谢hijack了,确实如此,加个Sleep(0)更好,让出余下的时间片,不会引起延迟,谢谢了