专栏首页calmound多线程-事件

多线程-事件

创建  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\n",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\n",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++深入详解》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • poj 2886 Who Gets the Most Candies?

    题意:n个人围城一圈,每个人决定下一个出局的人在他的第几个位置,首先出局的人是第k个人 分析:反素数+约瑟夫 这道题最主要需要理解的就是线段树是如何模拟的反素...

    用户1624346
  • Swap Nodes in Pairs

    问题:交换相邻的两个结点 分析:建立新链表每次插入ret->next后在插入ret,需要在判断下若最后只有一个结点不需要交换,注意每次交换了结点要把尾结点的下一...

    用户1624346
  • poj 1426 Find The Multiple (广搜)

    http://poj.org/problem?id=1426 题意:求n的倍数m,对于m的要是求所有位的数必须是0或1  a nonzero multiple ...

    用户1624346
  • Java通过Socket实现TCP编程,实现用户登录之服务器相应客户端,客户端和服务端之间的通信

    用户1289394
  • Dropbox Vs. Box:一场关于增长数字的博弈

    人称T客
  • 马化腾怒怼张一鸣 两位大佬为抖音“开撕”

    万万没想到,马化腾、张一鸣两位大佬会公然在朋友圈“开撕”!今日头条与腾讯之间的“战争”从内容竞争上升到了创始人间的“口水战”。

    IT派
  • Jepsen 测试框架在图数据库 Nebula Graph 中的实践

    在本篇文章中主要介绍图数据库 Nebula Graph 在 Jepsen 这块的实践。

    NebulaGraph
  • C++之类(一)

    在C++之中,我们使用类来定义自己的数据类型。通过自定义数据类型,可以使我们的编程变得更加方便。或者说C++设计类的目的就是为了使我们可以像使用基本数据类型一样...

    zy010101
  • 还在为 520 发愁吗?教你用 Python 写个表白神器!

    520 了,还在为表白发愁吗?教你用 Python 写个表白神器,给心仪的她(他)一个优雅的告白,本文实现用到的库是 turtle。

    Python小二
  • 腾讯TAPD上云三周年,敏捷助力数字化战“疫”

    瞬息万变的市场环境,给企业带来更多挑战,提升敏捷能力,成为迫切需要。 2020年,面对突如其来的疫情,企业协作与数字化转型呈现怎样的趋势? TAPD发布《20...

    腾讯大讲堂

扫码关注云+社区

领取腾讯云代金券