zoukankan      html  css  js  c++  java
  • 多线程-事件

    创建  CreateEvent

    销毁  CloseHandle

    事件变为有信号(可以使用信号)  SetEvent

    事件变为无信号(不可以使用信号)  ResetEvent

    事件的创建

    HANDLECreateEvent(
     LPSECURITY_ATTRIBUTES  lpEventAttributes,
     BOOL  bManualReset,
     BOOL  bInitialState,
     LPCTSTR lpName
    );
    

    第一个参数表示安全控制,一般直接传入NULL。

    第二个参数确定事件是手动置位还是自动置位,传入TRUE表示手动置位,传入FALSE表示自动置位。如果为自动置位,则对该事件调用WaitForSingleObject()后会自动调用ResetEvent()使事件变成未触发状态。打个小小比方,手动置位事件相当于教室门,教室门一旦打开(被触发),所以有人都可以进入直到老师去关上教室门(事件变成未触发)。自动置位事件就相当于医院里拍X光的房间门,门打开后只能进入一个人,这个人进去后会将门关上,其它人不能进入除非门重新被打开(事件重新被触发)。

    第三个参数表示事件的初始状态,传入TRUR表示已触发。

    第四个参数表示事件的名称,传入NULL表示匿名事件。

    SetEvent

    函数功能:触发事件

    函数原型:BOOLSetEvent(HANDLEhEvent);

    函数说明:每次触发后,必有一个或多个处于等待状态下的线程变成可调度状态。

     

    ResetEvent

    函数功能:将事件设为末触发

    函数原型:BOOLResetEvent(HANDLEhEvent);

     

    最后一个事件的清理与销毁

    由于事件是内核对象,因此使用CloseHandle()就可以完成清理与销毁了。

     

    #include<stdio.h>
    #include<process.h>
    #include<windows.h>
    
    int tickets=50;
    HANDLE g_Event;
    
    DWORD WINAPI Fun1(VOID *lp)
    {
    	while(true)
    	{
    		WaitForSingleObject(g_Event,INFINITE);
    		if(tickets>0)
    		{
    			printf("thread1 %d
    ",tickets--);
    			SetEvent(g_Event);
    		}
    		else
    		{
    			SetEvent(g_Event);
    			break;
    		}
    	}
    	return 0;
    }
    
    DWORD WINAPI Fun2(VOID *lp)
    {
    	while(true)
    	{
    		WaitForSingleObject(g_Event,INFINITE);
           if(tickets>0)
    	   {
    		   printf("thread2 %d
    ",tickets--);
    		   SetEvent(g_Event);
    	   }
    	   else 
    	   {
    		   SetEvent(g_Event);
    		   break;
    	   }
    	}
    	return 0;
    }
    
    int main()
    {
    	HANDLE handle1,handle2;
    	g_Event=CreateEvent(NULL,FALSE,FALSE,NULL);
    	SetEvent(g_Event);
    	handle1=CreateThread(NULL,0,Fun1,NULL,0,NULL);
    	handle2=CreateThread(NULL,0,Fun2,NULL,0,NULL);
        
        CloseHandle(handle1);
    	CloseHandle(handle2);
    	
    	Sleep(4000);
    	CloseHandle(g_Event);
    	return 0;
    }
    

     

    参考:http://blog.csdn.net/morewindows/article/details/7445233

             《VC++深入详解》

     

  • 相关阅读:
    【java编程】使用System.getProperty方法,如何配置JVM系统属性
    【java多线程】CountDownLatch
    【java多线程】ConcurrentLinkedHashMap
    【java编程】ServiceLoader使用看这一篇就够了
    【JVM】java对象
    【git】Git常用命令
    centos7安装配置mysql5.7
    第十三章 redis-cluster原理
    《mysql技术内幕 InnoDB存储引擎(第二版)》阅读笔记
    第二章 BIO与NIO
  • 原文地址:https://www.cnblogs.com/zsboy/p/3980894.html
Copyright © 2011-2022 走看看