|
#include "stdafx.h"
#include
#include
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); 0
for (int i=0;i
{
event=::CreateEvent(NULL,TRUE,FALSE,NULL); 1
}
for (i=0;i
{
hThrd=::CreateThread(NULL,0,ThreadFunc,(LPVOID)i,0,NULL); 2
if (hThrd!=NULL)
{
cout < <"Thread" < 3
}
}
WaitForMultipleObjects(THREAD_NUM,event,TRUE,INFINITE); 4
PulseEvent(g_Event); 6
WaitForMultipleObjects(THREAD_NUM,hThrd,TRUE,INFINITE); 8
for (i=0;i
{
CloseHandle(event);
CloseHandle(hThrd);
}
CloseHandle(g_Event);
cout < <"Process Finished" <
return 0;
}
DWORD WINAPI ThreadFunc(LPVOID n)
{
SetEvent(event[(int)n]); 5
while (TRUE)
{
switch(WaitForSingleObject(g_Event,INFINITE)) 7
{
case WAIT_OBJECT_0:
printf("Thread%d WAIT_OBJECT_0\n",(int)n+1); 9
return 0;
break;
default:
break;
}
}
return 0;
}
程序流程:
<1>进入main函数中,
<2>首先创建了1个事件g_Event和i个事件event和i个线程hThrd 如程序上 0,1,2
<3>这时,在主线程中打印:"Threadi Lauched" ,
并卡在第一个WaitForMultipleObjects(THREAD_NUM,event,TRUE,INFINITE);中等待event信号触发,
同时线程ThreadFunc(i个线程同时运行)启动,进入第一个SetEvent(event[(int)n]);
触发了所有event事件 如程序上的3,4,5
<4>因为这时子线程已经触发了事件组event
所以主线程WaitForMultipleObjects(THREAD_NUM,event,TRUE,INFINITE);通过
执行PulseEvent(g_Event);这条语句,
同时所有i个子线程都卡到switch(WaitForSingleObject(g_Event,INFINITE))等待g_Event事件被触发,
如程序上的6,7
<5>这时主线程又卡在第二个WaitForMultipleObjects(THREAD_NUM,hThrd,TRUE,INFINITE); 等待hThrd被触发?????/
而i个子线程都因为主线程执行了PulseEvent(g_Event);这条语句后触发了switch(WaitForSingleObject(g_Event,INFINITE))
语句,打印出:printf("Thread%d WAIT_OBJECT_0\n",(int)n+1); 这条
如程序上的8,9
<6>最后程序是如何触发这条WaitForMultipleObjects(THREAD_NUM,hThrd,TRUE,INFINITE);
使程序最终打印出:cout < <"Process Finished" <
问题:
1、我理解的这个程序流程是不是有问题的?
2、如<5>、<6>中所问:等待hThrd被触发?是怎么一回事,
最后程序是如何触发这条WaitForMultipleObjects(THREAD_NUM,hThrd,TRUE,INFINITE);???
3、PulseEvent(g_Event);这条是激活所有事件,可是参数g_Event只是单独定义的一个事件:g_Event=::CreateEvent(NULL,TRUE,FALSE,NULL);
而多事件:event=::CreateEvent(NULL,TRUE,FALSE,NULL);是通过对应的多个线程ThreadFunc(LPVOID n) 中SetEvent(event[(int)n]);
激活的,而不是通过 PulseEvent激活的啊 ??? |
|