VC++ 线程同步之事件对象(event)

news/2024/11/24 9:46:18/

VC++ 线程同步之事件对象(event)

Event是windows操作系统的一种内核对象,它可以用于进程间同步和线程间同步。

Event 方式是最具弹性的同步机制,因为他的状态完全由你去决定,不会像 Mutex 和 Semaphores 的状态会由类似:WaitForSingleObject 一类的函数的调用而改变,所以你可以精确的告诉 Event 对象该做什么事?以及什么时候去做!

固有特点(优点+缺点):
1、是一个系统核心对象,所以有安全描述指针,用完了要 CloseHandle 关闭句柄,这些是内核对象的共同特征;
2、因为是核心对象,所以执行速度稍慢(当然只是相比较而言);
3、因为是核心对象,而且可以命名,所以可以跨进程使用;
4、通常被用于 overlapped I/O 或被用来设计某些自定义的同步对象。

相关函数

复制代码
HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCTSTR lpName // object name);
lpEventAttributes : 一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。
bManualReset :   创建一个人工重置的事件(TRUE)使用ResetEvent()手动重置为无信号状态,创建一个自动重置的事件(FALSE)。当一个等待线程被释放时,自动重置状态为无信号状态。
bInitialState : 用于指明该事件是要初始化为已通知状态(TRUE)还是未通知状态(FALSE)
bManualReset为TRUE时:  人工重置事件,当一个等待线程被释放时,必须使用ResetEvent()手动重置为无型号状态当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。
bManualReset为FALSE时: 自动重置事件,当一个等待线程被释放时,自动重置状态为无信号状态当自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。
自动重置事件(通常没有必要为自动重置的事件调用ResetEvent函数)。BOOL WINAPI SetEvent( __in HANDLE hEvent );  把event对象设置为激活状态BOOL WINAPI ResetEvent( __in HANDLE hEvent );  把event对象设置为非激活状态BOOL WINAPI PulseEvent( __in HANDLE hEvent ); 如果是一个人工重置事件:把event对象设置为激活状态,唤醒“所有”等待中的线程,然后event恢复为非激活状态
如果是一个自动重置事件:把event对象设置为激活状态,唤醒 “一个”等待中的线程,然后event恢复为非激活状态

示例代码

1、创建一个事件对象:CreateEvent;
2、打开一个已经存在的事件对象:OpenEvent;
3、获得事件的占有权:WaitForSingleObject 等函数(可能造成阻塞);
4、释放事件的占有权(设置为激发(有信号)状态,以让其他等待中的线程苏醒):SetEvent;
5、手动置为非激发(无信号)状态:ResetEvent
6、关闭事件对象句柄:CloseHandle;

下面是使用Win32 API的Event对象实现线程同步的C++代码:

#include <iostream>  
#include <windows.h>  using namespace std;  HANDLE g_hEvent;               // 全局的事件对象  DWORD WINAPI ThreadProc(LPVOID lpParam)  
{  WaitForSingleObject(g_hEvent, INFINITE);  // 这里是需要同步的代码  cout << "Thread " << lpParam << " is running." << endl;  return 0;  
}  int main()  
{  g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);  HANDLE hThread[3];  for (int i = 0; i < 3; i++)  {  hThread[i] = CreateThread(NULL, 0, ThreadProc, (LPVOID)i, 0, NULL);  if (hThread[i] == NULL)  {  cout << "Thread " << i << " failed to create." << endl;  }  }  // 设置事件对象,允许线程执行  SetEvent(g_hEvent);  WaitForMultipleObjects(3, hThread, TRUE, INFINITE);  CloseHandle(g_hEvent);  return 0;  
}

在这个例子中,我们创建了一个全局的Event对象g_hEvent,这个对象用于同步多个线程。线程执行需要同步的代码前,首先调用WaitForSingleObject函数等待事件对象被设置,即等待允许执行的信号。主线程在创建所有子线程之后,调用SetEvent函数设置事件对象,多个线程才被允许执行。这样就能确保多个线程按照我们的要求同步执行,达到线程同步的目的。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器


http://www.ppmy.cn/news/235139.html

相关文章

VC++ 线程同步之互斥对象(mutex)

VC 线程同步之互斥对象&#xff08;mutex&#xff09; Mutex是内核对象&#xff0c;陷入内核时间性能相对较差&#xff08;与Critical Section相比&#xff09; 互斥量内核对象能够确保一个进程独占对一个资源的访问。互斥量与关键段&#xff08;线程同步方式&#xff09;的行…

Cisco wireless 802.1x认证

目录 一、实验环境二、WLC 9800配置&#xff1a;2.1 配置radius server和group 2.2 配置AAA&#xff1a;2.3 配置WLAN&#xff1a;2.4 配置policy&#xff1a;2.5 配置 policy tag&#xff08;关联wlan和policy&#xff09;&#xff1a;2.6 将tag关联至AP&#xff1a; 三、测试…

电子计算机X线体层摄影,电子计算机X线体层摄影检查诊断乳腺肿块的价值

上海医学1991年 T月(第14卷第 T期) 395 电子计算机X线体层摄影检查诊断乳腺肿块的价值 上海医科大学附属华山医院葺射 茎霎 沈天真陈克教 提要 本文报告了 100例女性乳腺肿块的电子计算机x线体层摄影(cT)检查资料&#xff0c;包括 5O佛 乳腺癌和 矗0侧各类乳腺良性病变&#xf…

5900x matlab,芯片工程师入手5900X平台,简单自用工具评测

芯片工程师入手5900X平台,简单自用工具评测 2021-02-15 22:13:17 23点赞 31收藏 37评论 如何才能快速换一种生活方式?参加#牛年Flag#征稿活动,征集你2021年的购物学习生活计划!>>点击查看活动详情< 创作立场声明:本文所测商品为自费购买并作为生产使用。坚持独立…

计算机知识讲稿,计算机基础知识讲稿.ppt

计算机基础知识讲稿.ppt 1 第一讲计算机基础知识 一 什么是计算机计算机 是一种用于存储和处理信息的通用机器 2 第一讲计算机基础知识 二 计算机发展史1946年2月 第一台计算机诞生在美国 ENIAC 用了18800个电子管 30吨重 耗电150KW 占地160平方米 运算速度 5000次 秒 ENIAC存储…

关于计算机图像基础知识的整理

1.色彩深度&#xff1a; 1位&#xff1a;2种颜色&#xff0c;单色光&#xff0c;黑白二色&#xff0c;用于compact Macintoshes。 2位&#xff1a;4种颜色&#xff0c;CGA&#xff0c;用于gray-scale早期的NeXTstation及color Macintoshes。 3位&#xff1a;8种颜色&#xff…

大学计算机基础笔记

目录 第一章&#xff1a;计算机基础 第二章 操作系统Windows7 第三章&#xff1a;Word 第四章 Excel电子表格软件 第五章 演示文稿软件 第六章 计算机网络 第7章 多媒体技术 标题第一章&#xff1a;计算机基础 1.1.1计算机诞生 1.世界上第一台电子计算机(数字积分计算机)…

信息技术(计算机基础知识精华版)

第1部分 计算机基础知识 计算机特点与应用范围 计算机特点 速度快 MIPS&#xff08;百万条指令/秒&#xff09; BIPS(十亿条指令/秒)MIPS:Million Instructions per second; BIPS: Billion Instructions per second存储容量大 精度高 在程序控制下自动完成具有…