第一个 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相关推荐

  1. 秒杀多线程第六篇 经典线程同步 事件Event

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...

  2. 经典线程同步 事件Event

    Event 内核对象,实际上是解决线程同步问题的利器. 介绍下函数应用: 第一个 CreateEvent 函数功能:创建事件 函数原型: HANDLECreateEvent( LPSECURITY_A ...

  3. 线程同步 -事件Event、临界区对象CriticalSection

    事件Event: 基本函数: 全局对象:HANDLE g_hEvent 创建事件对象:g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL) 重置状态为无信号:Rese ...

  4. 秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量

    前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了 ...

  5. 秒杀多线程第八篇 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  6. 秒杀多线程第七篇 经典线程同步 互斥量Mutex

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  7. 秒杀多线程第五篇 经典线程同步 关键段CS

    上一篇<秒杀多线程第四篇 一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文首先介绍下如何使用关键段,然 ...

  8. 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)

    多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上) 转自 http://www.cnblogs.com/freshman0216/archive/2008/07/27/ ...

  9. 经典线程同步 关键段CS

    本文参考http://blog.csdn.net/morewindows/article/details/7442639 关键段CRITICAL_SECTION一共就四个函数,使用很是方便.下面是这四 ...

最新文章

  1. 在PHP中实现StringBuilder类
  2. mysql-proxy 0.8.5_主从读写分离----mysql-proxy0.8.5安装与配置
  3. 可视化拖拽 UI 布局之拖拽篇
  4. ArrayList和LinkedList的插入删除性能差距到底有多大
  5. 6.相对与绝对目录 cd mkdir rmdir rm
  6. Nginx基本配置备忘
  7. java 注解解析_Java知识点总结(注解-解析注解)
  8. 数据存储: CheckBoxPreference
  9. 基于Linux系统的网络聊天室实现
  10. 电容式触摸感应按键解决方案AD
  11. 计算机科学技术技术的发展趋势,计算机科学与技术的发展趋势分析
  12. QT WA_TranslucentBackground CEF界面无法展现 透明无效
  13. Base64加解密__完整版有解释
  14. 计算机的音乐怎样弹生日快乐,5 分钟让你学会用吉他弹《生日快乐》歌
  15. 计算机领域影响因子3.5什么水平,计算机学科SCI(包括SCI-E)影响因子排名
  16. 使用echarts扩展地图案例
  17. PPTV多屏互动服务器可以看文档吗,关闭或删除PPTv多屏互动服务器的方法
  18. LAS语音识别框架发展简述
  19. 数据结构求子串、非空子串、真子串、非空真子串数
  20. 低功耗蓝牙芯片发展方向

热门文章

  1. 基于 ESP32 的智能家居系统设计
  2. Object类型如何转化list
  3. 【PythonGIS】无人机影像的像素坐标计算图片某点的地理/投影坐标
  4. K8S入门-05-配置node1节点加入集群
  5. 加入区块链技术的在线赌博是否合法?
  6. 把VSO作为GitHub上JavaScript项目的免费CI服务器
  7. 电脑cpu风扇转一下就停,不停重复,无法开机。
  8. 中望cad机械版2020(ZWCAD Mechanical 2020)
  9. Caffe的深度学习训练全过程
  10. 08.音频系统:第003课_Linux音频驱动程序:第003节_耳麦拔插事件调用流程分析