event objects 小记录

在做关于event对象的一点儿认识,   代码原型是 《Multithreading Application in Win32》中的 keeping your threads on a leash 章节中的一段小程序。我改了下:

 

#include  < windows.h >
#include 
< stdio.h >

DWORD WINAPI ThreadPro(LPVOID);

HANDLE hRequestExitEvent
= FALSE;


int  main( int  argc,  char   * argv[]) 
{    
    HANDLE hThreads[
2];
    DWORD dwThreadId;
    DWORD dwExitCode
=0;
    
int i;

    hRequestExitEvent
=CreateEvent(NULL,TRUE,FALSE,NULL);       //注意该Event对象第三个参数 bInitialState 初始置为FALSE 表示开始为非激发状态 

    
for (i=0;i<2;i++)                                            //这里开了两个线程
    {
        hThreads[i]
=CreateThread(NULL,0,ThreadPro,(PVOID)i,0,&dwThreadId);
    }


    Sleep(1000);

    SetEvent(hRequestExitEvent);
    
    
for (i=0;i<2;i++)
    
{
        CloseHandle(hThreads[i]);
    }

    
return 0;
}


DWORD WINAPI ThreadPro(LPVOID n)
{
    
int i;
    
    
for (i=0;i<10000000;i++)
    
{
        
if (WaitForSingleObject(hRequestExitEvent,0)!=WAIT_TIMEOUT)   //当hRequestExitEvent初始值为FALSE 那么也就是返回来的是WAIT_TIMEOUT
        {
            printf(
"thread #%d terminate  i:%d ",n,i);
            
return -1;
        }

    }

    
return 0;
}

 

1.在CreateEvent中第三个参数 bInitialState 初始置为FALSE 表示开始为非激发状态,那么最开始的event是非激发的,那么在开辟的线程中WaitForSingleObject(hRequestExitEvent,0), 如果hRequestExitEvent是非激发的那么必定返回值是WAIT_TIMEOUT

2.WaitForSingleObject(hRequestExitEvent,0)   参数0表示无需等待 我要立马得到我要的hRequestExitEvent——当然这里hRequestExitEvent是非激发状态,那么就会得到超时 WAIT_TIMEOUT

3.运行结果如下:

原因开始我没想明白 后来看了看代码,在开启两个线程后,我在主线程中立刻设置了Sleep(1000)  那么在其他线程中由于WaitForSingleObject(hRequestExitEvent,0)始终为WAIT_TIMEOUT,注意这里hRequestExitEvent还是非激发状态  一直到主线程sleep苏醒后才设置的 SetEvent(hRequestExitEvent)   这是其他线程已经执行完了,这过程中没有打印任何数据出来。

如果我们把程序语句顺序改为如下,其他不变:

SetEvent(hRequestExitEvent); Sleep(1000);

那么得到的结果可能是:

原因就是开了两个线程之后 现在是三个线程"同时"执行了,主线程立马设置了hRequestExitEvent 为激发态 (SetEvent(hRequestExitEvent))   而后两个副线程依次"获取"到event,打印出thread # terminate 字样

你可能感兴趣的:(object)