当前位置: 代码迷 >> 多核软件开发 >> 关于多线程同步中的对象有无信号状态的有关问题
  详细解决方案

关于多线程同步中的对象有无信号状态的有关问题

热度:8077   发布时间:2013-02-26 00:00:00.0
关于多线程同步中的对象有无信号状态的问题
#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多线程程序设计》
  相关解决方案