Windows多线程(四) 经典线程同步 事件Event
第一个 CreateEvent
函数功能:创建事件
函数原型:
HANDLECreateEvent(
LPSECURITY_ATTRIBUTESlpEventAttributes,
BOOLbManualReset,
BOOLbInitialState,
LPCTSTRlpName
);
函数说明:
第一个参数表示安全控制,一般直接传入NULL。
第二个参数确定事件是手动置位还是自动置位,传入TRUE表示手动置位,传入FALSE表示自动置位。如果为自动置位,则对该事件调用WaitForSingleObject()后会自动调用ResetEvent()使事件变成未触发状态。打个小小比方,手动置位事件相当于教室门,教室门一旦打开(被触发),所以有人都可以进入直到老师去关上教室门(事件变成未触发)。自动置位事件就相当于医院里拍X光的房间门,门打开后只能进入一个人,这个人进去后会将门关上,其它人不能进入除非门重新被打开(事件重新被触发)。
第三个参数表示事件的初始状态,传入TRUR表示已触发。
第四个参数表示事件的名称,传入NULL表示匿名事件。
第二个 OpenEvent
函数功能:根据名称获得一个事件句柄。
函数原型:
HANDLEOpenEvent(
DWORDdwDesiredAccess,
BOOLbInheritHandle,
LPCTSTRlpName //名称
);
函数说明:
第一个参数表示访问权限,对事件一般传入EVENT_ALL_ACCESS。详细解释可以查看MSDN文档。
第二个参数表示事件句柄继承性,一般传入TRUE即可。
第三个参数表示名称,不同进程中的各线程可以通过名称来确保它们访问同一个事件。
第三个SetEvent
函数功能:触发事件
函数原型:BOOLSetEvent(HANDLEhEvent);
函数说明:每次触发后,必有一个或多个处于等待状态下的线程变成可调度状态。
第四个ResetEvent
函数功能:将事件设为末触发
函数原型:BOOLResetEvent(HANDLEhEvent);
最后一个事件的清理与销毁
由于事件是内核对象,因此使用CloseHandle()就可以完成清理与销毁了。
#include "stdio.h"
#include "process.h"
#include "windows.h"long g_nNum;
unsigned int __stdcall Fun(void* pPM);
const int THREAD_NUM =10;
//事件与关键段
HANDLE g_hThreadEvent;
CRITICAL_SECTION g_csThreadCode;
int main()
{printf(" 经典线程同步 事件Event\n");//初始化事件和关键段,自动置位,初始无触发的匿名事件g_hThreadEvent =CreateEvent(NULL,FALSE,FALSE,NULL);InitializeCriticalSection(&g_csThreadCode);HANDLE handle[THREAD_NUM];g_nNum =0;int i=0;while(i<THREAD_NUM){handle[i] =(HANDLE)_beginthreadex(NULL,0,Fun,&i,0,NULL);WaitForSingleObject(g_hThreadEvent,INFINITE); //等待事件被触发,非常重要i++;}WaitForMultipleObjects(THREAD_NUM,handle,TRUE,INFINITE);//销毁事件和关键段CloseHandle(g_hThreadEvent);DeleteCriticalSection(&g_csThreadCode);return 0;
}unsigned int __stdcall Fun(void* pPM)
{int nThreadNum =*(int*)pPM;SetEvent(g_hThreadEvent); //触发事件Sleep(50);//some work should to doEnterCriticalSection(&g_csThreadCode);g_nNum++;Sleep(0);printf("线程编号为%d 全局资源值为%d\n",nThreadNum,g_nNum);LeaveCriticalSection(&g_csThreadCode);return 0;
}
Windows多线程(四) 经典线程同步 事件Event相关推荐
- 秒杀多线程第六篇 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
- 经典线程同步 事件Event
Event 内核对象,实际上是解决线程同步问题的利器. 介绍下函数应用: 第一个 CreateEvent 函数功能:创建事件 函数原型: HANDLECreateEvent( LPSECURITY_A ...
- 线程同步 -事件Event、临界区对象CriticalSection
事件Event: 基本函数: 全局对象:HANDLE g_hEvent 创建事件对象:g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL) 重置状态为无信号:Rese ...
- 秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量
前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了 ...
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- 秒杀多线程第七篇 经典线程同步 互斥量Mutex
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- 秒杀多线程第五篇 经典线程同步 关键段CS
上一篇<秒杀多线程第四篇 一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文首先介绍下如何使用关键段,然 ...
- 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)
多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上) 转自 http://www.cnblogs.com/freshman0216/archive/2008/07/27/ ...
- 经典线程同步 关键段CS
本文参考http://blog.csdn.net/morewindows/article/details/7442639 关键段CRITICAL_SECTION一共就四个函数,使用很是方便.下面是这四 ...
最新文章
- 在PHP中实现StringBuilder类
- mysql-proxy 0.8.5_主从读写分离----mysql-proxy0.8.5安装与配置
- 可视化拖拽 UI 布局之拖拽篇
- ArrayList和LinkedList的插入删除性能差距到底有多大
- 6.相对与绝对目录 cd mkdir rmdir rm
- Nginx基本配置备忘
- java 注解解析_Java知识点总结(注解-解析注解)
- 数据存储: CheckBoxPreference
- 基于Linux系统的网络聊天室实现
- 电容式触摸感应按键解决方案AD
- 计算机科学技术技术的发展趋势,计算机科学与技术的发展趋势分析
- QT WA_TranslucentBackground CEF界面无法展现 透明无效
- Base64加解密__完整版有解释
- 计算机的音乐怎样弹生日快乐,5 分钟让你学会用吉他弹《生日快乐》歌
- 计算机领域影响因子3.5什么水平,计算机学科SCI(包括SCI-E)影响因子排名
- 使用echarts扩展地图案例
- PPTV多屏互动服务器可以看文档吗,关闭或删除PPTv多屏互动服务器的方法
- LAS语音识别框架发展简述
- 数据结构求子串、非空子串、真子串、非空真子串数
- 低功耗蓝牙芯片发展方向
热门文章
- 基于 ESP32 的智能家居系统设计
- Object类型如何转化list
- 【PythonGIS】无人机影像的像素坐标计算图片某点的地理/投影坐标
- K8S入门-05-配置node1节点加入集群
- 加入区块链技术的在线赌博是否合法?
- 把VSO作为GitHub上JavaScript项目的免费CI服务器
- 电脑cpu风扇转一下就停,不停重复,无法开机。
- 中望cad机械版2020(ZWCAD Mechanical 2020)
- Caffe的深度学习训练全过程
- 08.音频系统:第003课_Linux音频驱动程序:第003节_耳麦拔插事件调用流程分析