#include "stdafx.h"
#include "windows.h"
int number = 1;
HANDLE hEvent;
unsigned long __stdcall ThreadProc1(void* lpParameter)
{
while (number < 100)
{
WaitForSingleObject(hEvent,INFINITE);
printf("线程1当前计数:%d\n",number);
number ++;
Sleep(100);
SetEvent(hEvent);
}
return 0;
}
unsigned long __stdcall ThreadProc2(void* lpParameter)
{
while (number < 100)
{
WaitForSingleObject(hEvent,INFINITE);
printf("线程2当前计数:%d\n",number);
number ++;
Sleep(100);
SetEvent(hEvent);
}
return 0;
}
int main(int argc, char* argv[])
{
HANDLE hThread1 = CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
HANDLE hThread2 = CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
hEvent = CreateEvent(NULL,FALSE,TRUE,"event");
CloseHandle(hThread1);
CloseHandle(hThread2);
while (true)
{
;
}
return 0;
}
这个是线程同步的一个经典的例子,用一个事件对象实现线程同步,WaitForSingleObject在等待hEvent是否为有无信号状态,有的话就执行线程,我不理解的是hEvent这个事件变量什么时候为有信号状态,什么时候又是没有信号的状态?什么在改变它的有无呢?还有,CreateEvent(NULL,FALSE,TRUE,"event");这个最后一个event有什么作用?
------解决方案--------------------------------------------------------
SetEvent就变成有信号了,然后WaitForSingleObject检查如果该Event有信号就将此Event设置成无信号状态
最后一个Event是事件对象的名称,可以方便在其它线程或进程中调用OpenEvent使用此Event
------解决方案--------------------------------------------------------
CreateEvent(NULL,FALSE,TRUE,"event");
我不理解的是hEvent这个事件变量什么时候为有信号状态
[setevent让线程变成有信号],
什么时候又是没有信号的状态?
[在这里hEvent一进入有信号状态,其中一个线程的wait函数就获得信号而返回,同时因为你创建的是FALSE Manual Reset,那返回的时候,系统就自动把这个事件设为无信号状态]
什么在改变它的有无呢?
[WaitForSingleObject]
还有,CreateEvent(NULL,FALSE,TRUE,"event");这个最后一个event有什么作用?
[这里的“event”,是这个event的名字。如果你创建的event是有名字的,那就可以在本程序和其他程序里用openevent函数打开这个event(其实你在这个程序或其他程序用createevent创建一个名字为“event” 的event还是打开这个event),而后你就可以对这个event进行操作,比如设置成有信号状态]
建议: 理解上面的原理
(1)你把上面其中一个线程的sleep改成10,而后你创建一个新的带UI的进程,加个button,而后点一下就设置成event为有信号状态。如果你点的话,你就会发现,log不先原来那样是110ms出两个log,而是10s就一个log。
(2)看一下《Win32多线程程序设计》