windows C++多线程同步<2>-事件

news2025/1/11 8:54:38

windows C++多线程同步<2>-事件

事件对象和关键代码段不同,它是属于内核对象;又分为人工重置事件对象和自动重置事件对象;
同一个线程不允许在不释放事件的情况下多次获取事件;

相关API

在这里插入图片描述
在这里插入图片描述
白话来讲:
第一个参数一般默认NULL, 使用默认安全性;
第二个参数代表是人工重置还是自动重置;
第三个参数代表事件的初始状态,true代表有信号,false代表无信号;
第四个参数就是这个事件的名字,可以为NULL, 也可以根据自己序曲给一个特定的字符串;

SetEvent(HANDLE m_handle)
设置事件为有效状态

ResetEvent(HANDLE m_handle)
设置事件为无效状态

WaitForSingleobject(HANDLE m_handle);
请求获取事件

代码示例

#include<iostream>
#include<Windows.h>
using namespace std;

HANDLE g_cs;
int ticks =100;
DWORD WINAPI Func1(LPVOID lpParameter)
{
	while(true)
	{
		WaitForSingleObject(g_cs , INFINITE);
		ResetEvent(g_cs);
		if(ticks>0)
		{
			cout<<"thread1 "<<ticks<<endl;
			ticks--;
			SetEvent(g_cs);
		}
		else
		{
			SetEvent(g_cs);
			break;
		}
	}

	return 0;
}
DWORD WINAPI Func2(LPVOID lpParameter)
{
	while(true)
	{
		WaitForSingleObject(g_cs , INFINITE);
		ResetEvent(g_cs);
		if(ticks>0)
		{
			cout<<"thread2 "<<ticks<<endl;
			ticks--;
			SetEvent(g_cs);
		}
		else
		{
			SetEvent(g_cs);
			break;
		}
	}
	return 0;
}

int main()
{
	g_cs = CreateEvent(NULL,TRUE , FALSE,NULL);//人工重置事件,初始状态为无效
	SetEvent(g_cs);
	HANDLE hThread1;
	HANDLE hThread2;
	hThread1 = CreateThread(NULL , 0 ,Func1,NULL,0,NULL);
	hThread1 = CreateThread(NULL , 0 ,Func2,NULL,0,NULL);
	Sleep(2000);
	return 0;
}




在这里插入图片描述
由上图可见,人工重置事件并不能真正实现线程同步;强烈不建议使用人工重置事件;
在这里插入图片描述
自动重置事件对象线程同步代码示例

#include<iostream>
#include<Windows.h>
using namespace std;

HANDLE g_cs;
int ticks =100;
DWORD WINAPI Func1(LPVOID lpParameter)
{
	while(true)
	{
		WaitForSingleObject(g_cs , INFINITE);
		if(ticks>0)
		{
			cout<<"thread1 "<<ticks<<endl;
			ticks--;
			SetEvent(g_cs);
		}
		else
		{
			SetEvent(g_cs);
			break;
		}
	}

	return 0;
}
DWORD WINAPI Func2(LPVOID lpParameter)
{
	while(true)
	{
		WaitForSingleObject(g_cs , INFINITE);
		if(ticks>0)
		{
			cout<<"thread2 "<<ticks<<endl;
			ticks--;
			SetEvent(g_cs);
		}
		else
		{
			SetEvent(g_cs);
			break;
		}
	}
	return 0;
}

int main()
{
	g_cs = CreateEvent(NULL,FALSE , FALSE,NULL);//自动重置事件
	SetEvent(g_cs);
	HANDLE hThread1;
	HANDLE hThread2;
	hThread1 = CreateThread(NULL , 0 ,Func1,NULL,0,NULL);
	hThread1 = CreateThread(NULL , 0 ,Func2,NULL,0,NULL);
	Sleep(2000);
	return 0;
}






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/787255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

尚硅谷大数据项目《在线教育之采集系统》笔记001

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P004 P006 P007 P009 P010 P017 P025 P026 P027 P028 P030 P004 将数据以图形图表的方式展示出来&#xff01; P006 数据埋点 所谓埋点就是在应用中特定的流程收集一些信息&…

【Linux命令200例】cksum用于计算文件的校验和

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

[SSM]Spring IoC注解式开发

目录 十二、Spring IoC注解式开发 12.1回顾注解 12.1.1自定义注解 12.1.2使用注解 12.1.3通过反射机制读取注解 12.2声明Bean的注解 12.3Spring注解的使用 12.4选择性实例化Bean 12.5负责注入的注解 12.5.1Value 12.5.2Autowired与Qualifier 12.5.3Resource 12.6全…

Maven发布中央仓库始终报403

把域名 oss.sonatype.org 全部替换为&#xff1a;s01.oss.sonatype.org

Spring Cloud【SkyWalking服务环境搭建、微服务接入SkyWalking探针、Docker搭建Elasticsearch环境 】(十四)

目录 分布式请求链路追踪_SkyWalking服务环境搭建 分布式请求链路追踪_微服务接入SkyWalking探针 分布式请求链路追踪_Docker搭建Elasticsearch环境 分布式请求链路追踪_SkyWalking使用Elasticsearch持久化 分布式请求链路追踪_SkyWalking自定义链路追踪 分布式请求链路…

疲劳驾驶检测和识别3:Android实现疲劳驾驶检测和识别(含源码,可实时检测)

疲劳驾驶检测和识别3&#xff1a;Android实现疲劳驾驶检测和识别(含源码&#xff0c;可实时检测) 目录 疲劳驾驶检测和识别3&#xff1a;Android实现疲劳驾驶检测和识别(含源码&#xff0c;可实时检测) 1.疲劳驾驶检测和识别方法 2.人脸检测方法 3.疲劳驾驶检测和识别模型…

24 鼠标常用事件

鼠标进入&#xff1a;enterEvent鼠标离开&#xff1a;leaveEvent鼠标按下&#xff1a;mousePressEvent鼠标释放&#xff1a;mouseRelaseEvent鼠标移动&#xff1a;mouseMoveEvent 提升为自定义控件MyLabel 代码&#xff1a; //mylabel.h #ifndef MYLABEL_H #define MYLABEL_H#…

linux LVM磁盘管理

Linux运维过程中经常会遇到扩容的场景&#xff0c;下面做一点简单笔记&#xff0c;所谓好记性不如烂笔头。 1、新建磁盘挂载 &#xff08;1&#xff09;先看看主机上有没有挂载磁盘或挂载的磁盘有没有剩余的。 如下图可以看到这台机器挂了两个盘&#xff0c;一个/dev/sda,这…

【项目管理】第三节:PMP备考学习建议

文章目录 1.项目管理的价值观与方法论2.PMP开始的形式和题型 1.项目管理的价值观与方法论 对于中国考生而言&#xff0c;PMP”考试有两关要过:第一关是认知升级&#xff0c;考生通过学习和梳理项目管理知识&#xff0c;提升自己对项目管理的认知;第二关是思维升级&#xff0c;…

【Vue3】Vue3中的组合式API是什么?hook是什么?什么是“组合式函数”?项目中如何使用自定义 hook 函数?

组合式API与hook 一、什么是组合式 API&#xff1f;&#xff08;composition-api&#xff09;二、什么是组合式函数&#xff1f;&#xff08;hook&#xff09;2.1 无状态的函数&#xff08;utils&#xff09;2.2 有状态的函数&#xff08;hooks&#xff09;2.3 utils与hooks的联…

yolov5s模型剪枝详细过程(v6.0)

本文参考github上大神的开源剪枝项目进行学习与分享&#xff0c;具体链接放在文后&#xff0c;希望与大家多多交流&#xff01; 一、原模型训练 在官方源码上训练yolov5模型&#xff0c;支持v6.0分支的n/s/m/l模型&#xff0c;我这里使用的是v5s&#xff0c;得到后将项目clone到…

Cesium态势标绘专题-椭圆(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

图像处理之Hough变换检测直线

hough变换-直线检测 一、 前言二、Hough 变换三、直线检测四、代码实现1.hough检测2.画直线代码3.画hough空间代码4.检测结果 一、 前言 霍夫变换是一种特征检测(feature extraction)&#xff0c;被广泛应用在图像分析&#xff08;image analysis&#xff09;、计算机视觉(com…

[算法通关村] 1.2 链表的插入

上一节我们谈到了链表的概念&#xff0c;以及链表的创建方法&#xff0c;忘记的小伙伴可以复习一下&#xff1a; [算法通关村] 1.1 单向链表的创建 今天我们来探究一下链表的插入&#xff0c;链表的插入共有 3 种可能性&#xff0c;分别是在链表的头部插入、在中间插入&#x…

CMake学习-All in one

参考引用 CMake与Make最简单直接的区别通过例子学习CMakeLIO-SAM 1. 引言 1.1 什么是 CMake 1.1.1 CMake 背景 1.1.2 CMake 定义 CMake 是一个跨平台的安装&#xff08;编译&#xff09;工具&#xff0c;可以用简单的语句来描述所有平台的安装&#xff08;编译&#xff09;过…

基础算法-数组模拟队列

队列&#xff1a;先进先出 什么叫做队列&#xff1a; 就是一个特殊的数组。这个数组&#xff0c;最前面叫队头&#xff0c;最后面叫队尾。只允许在最后面添加元素&#xff0c;只允许在最前面删除元素。 解题思路&#xff1a; 用一个数组 q 保存数据。 用 hh 代表队头&…

关于PyTorch中一维卷积Conv1d的理解

首先明确一点&#xff0c;PyTorch中的一维卷积是从左往右做的&#xff0c;不是从上往下。 然后明确第二点&#xff0c;一维卷积和二维卷积最大的区别在于&#xff0c;一维卷积的卷积方向只有一个维度&#xff0c;一维卷积的卷积核不像二维卷积核一样可以左右和上下两个维度移动…

Mysql-主从复制与读写分离

Mysql 主从复制、读写分离 一、前言&#xff1a;二、主从复制原理1.MySQL的复制类型2. MySQL主从复制的工作过程;3.MySQL主从复制延迟4. MySQL 有几种同步方式&#xff1a;5.Mysql应用场景 三、主从复制实验1.主从服务器时间同步1.1 master服务器配置1.2 两台SLAVE服务器配置 2…

CRM系统化整合从N-1做减法实践 | 京东物流技术团队

1 背景 京销易系统已经接入大网、KA以及云仓三个条线商机&#xff0c;每个条线商机规则差异比较大&#xff0c;当前现状是独立实现三套系统分别做支撑。 2 目标 2022年下半年CRM目标是完成9个新条线业务接入&#xff0c;完成销售过程线上化&#xff0c;实现销售规则统一。 …

【Git】—— 分⽀的基本操作

目录 &#xff08;一&#xff09;理解分⽀ &#xff08;二&#xff09;创建分⽀ &#xff08;三&#xff09;切换分⽀ &#xff08;四&#xff09;合并分⽀ &#xff08;五&#xff09;删除分⽀ 总结 &#xff08;一&#xff09;理解分⽀ 本章开始介绍 Git 的杀⼿级功能之…