当前位置: 首页 > news >正文

【学习笔记】多进程信号量控制

 

目录

1、CreateSemaphore

2、ReleaseSemaphore

3、CreateEvent

4、SetEvent

5、WaitForSingleObject

程序案例1:

程序案例2:


1、CreateSemaphore

创建一个计数信号量对象,成功时返回信号量对象的句柄;失败时返回NULL;

HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 安全属性LONG lInitialCount,                          // 初始计数LONG lMaximumCount,                          // 最大计数LPCTSTR lpName                               // 信号量的名字
);
  • lpSemaphoreAttributes:指向 SECURITY_ATTRIBUTES 结构的指针,确定信号量的安全性。可以设置为 NULL。
  • lInitialCount:信号量的初始计数值。
  • lMaximumCount:信号量的最大计数值。
  • lpName:信号量的名字。可以设置为 NULL,表示没有名字。

2、ReleaseSemaphore

增加信号量的计数值。成功时返回非零值;失败时返回 0。

BOOL ReleaseSemaphore(HANDLE hSemaphore, // 信号量的句柄LONG lReleaseCount, // 释放的计数值LPLONG lpPreviousCount // 指向存储原始计数的变量的指针
);
  • hSemaphore:信号量的句柄。
  • lReleaseCount:增加的计数值。
  • lpPreviousCount:指向存储增加前的计数值的变量的指针。可以设置为 NULL。

3、CreateEvent

创建一个事件对象,用于通知线程或进程发生了特定事件。成功时返回事件对象的句柄;失败时返回NULL。

HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性BOOL bManualReset,                       // 是否手动重置事件BOOL bInitialState,                     // 初始状态LPCTSTR lpName                          // 事件的名字
);
  • lpEventAttributes:指向 SECURITY_ATTRIBUTES 结构的指针,确定事件的安全性。可以设置为 NULL。
  • bManualReset:指定事件是否需要手动重置。如果为 TRUE,则必须手动重置事件;如果为 FALSE,则系统会自动重置事件。
  • bInitialState:事件的初始状态。如果为 TRUE,事件在创建时为有信号状态;如果为 FALSE,为无信号状态。
  • lpName:事件的名字。可以设置为 NULL,表示没有名字。

4、SetEvent

设置事件对象为有信号状态。成功时返回非零值;失败时返回 0。

BOOL SetEvent(HANDLE hEvent);
  • hEvent:事件对象的句柄。

5、WaitForSingleObject

等待一个对象的状态变为有信号状态,或者等待超时。

DWORD WaitForSingleObject(HANDLE hHandle,   // 对象的句柄DWORD dwMilliseconds // 超时时间,单位为毫秒
);

 参数:

  • hHandle:对象的句柄,例如信号量或事件。
  • dwMilliseconds:等待的超时时间。如果设置为 INFINITE,则表示无限等待直到对象变为有信号状态。

返回值:

  • WAIT_OBJECT_0:对象变为有信号状态。
  • WAIT_TIMEOUT:超时。
  • WAIT_FAILED:函数失败。

程序案例1:

以下程序实现功能:

        四个保存图像的线程;  一个信息发送的线程

        当四个保存图像的线程都执行完毕之后,发送一次信号

#include <iostream>
#include <thread>
#include <Windows.h>
#include <vector>using namespace std;HANDLE steel_signal_end; // 用于通知主线程所有图像保存完成的事件
HANDLE semaphore;        // 用于计数已完成图像保存的线程数void save_image(int idex) {while (true) {Sleep(6000);// 如果是最后一个完成保存的线程,设置事件LONG previous_count;// ReleaseSemaphore:信号量的句柄、增加的计数值、指向存储增加前的计数值的变量的指针// 增加的计数值:函数中设为了1if (ReleaseSemaphore(semaphore, 1, &previous_count) && previous_count + 1 == 4) {cout << idex << "最后完成" << endl;SetEvent(steel_signal_end);}}}void send_message() {const int total_threads = 4;// 创建手动重置事件,初始状态为非触发状态steel_signal_end = CreateEvent(NULL, TRUE, FALSE, NULL);   // 安全属性、是否手动重置事件、初始状态、事件的名字// 创建计数信号量,初始计数为0,最大计数为total_threadssemaphore = CreateSemaphore(NULL, 0, total_threads, NULL);   // 安全属性、初始计数、最大计数、信号量的名字while (true) {cout << "等待信号触发" << endl;// 主线程等待所有图像保存完成WaitForSingleObject(steel_signal_end, INFINITE);CloseHandle(semaphore);semaphore = CreateSemaphore(NULL, 0, total_threads, NULL);cout << "一个批次完成" << endl;// 重置事件以准备下一批图像的保存ResetEvent(steel_signal_end);}
}int main() {vector<std::thread> threads;for (unsigned int i = 0; i <= 3; i++) {threads.emplace_back(save_image, i);}threads.emplace_back(send_message);for (auto& t : threads) {t.join();}return 0;
}

程序案例2:

只使用计数信号量进行控制

#include <iostream>
#include <thread>
#include <Windows.h>
#include <vector>using namespace std;HANDLE semaphore;       void save_image() {while (true) {Sleep(5000);ReleaseSemaphore(semaphore, 1, NULL);}
}void send_message() {semaphore = CreateSemaphore(NULL, 0, 1, NULL);   // 安全属性、初始计数、最大计数、信号量的名字while (true) {cout << "等待信号触发" << endl;WaitForSingleObject(semaphore, INFINITE);cout << "保存一次图片" << endl;}
}int main() {vector<std::thread> threads;threads.emplace_back(send_message);threads.emplace_back(save_image);for (auto& t : threads) {t.join();}return 0;
}

相关文章:

【学习笔记】多进程信号量控制

目录 1、CreateSemaphore 2、ReleaseSemaphore 3、CreateEvent 4、SetEvent 5、WaitForSingleObject 程序案例1&#xff1a; 程序案例2&#xff1a; 1、CreateSemaphore 创建一个计数信号量对象&#xff0c;成功时返回信号量对象的句柄&#xff1b;失败时返回NULL&…...

Redis与Memorycache的区别

Redis与Memorycache主要是持久线程和持久化的区别 1、从性能方面来说&#xff1a; Redis是单线程的&#xff0c;优点是CPU开销小&#xff0c;省去多线程线程之间切换的开销&#xff0c;但是相对于Memorycache来说海量数据的相对较低 Memorycache使用了多线程技术&#xff0c;数…...

docker和Helm Chart的基本命令和操作

一、docker基本命令和操作 1. docker login【登录】 登录 docker client&#xff0c;登录成功之后会显示 Login Succeeded。 docker login登陆到指定的镜像仓库&#xff0c;docker pull 和 docker push 操作都需要预先执行 docker login 操作&#xff1b; 指令&#xff1a;&a…...

Node中的CSRF攻击和防御

Node中的CSRF攻击和防御 假设有一个网上银行系统&#xff0c;用户可以通过该系统进行转账操作。转账功能的URL可能是这样的&#xff1a; https://www.bank.com/transfer?toAccount123456&amount1000当用户登录到银行系统&#xff0c;并在浏览器中访问这个URL时&#xff…...

CSS 多按钮根据半圆弧度排列

需求 多个按钮根据弧度&#xff0c;延边均匀排列。 实现 HTML 分两级&#xff1b;第一级&#xff0c;外层定义按钮的 compose-container 宽度&#xff1b;第二级&#xff0c;按钮集合&#xff0c;使用方法 styleBtn(index)&#xff0c;根据索引计算&#xff1b; <div c…...

【Linux】网络编程套接字Scoket:UDP网络编程

目录 一、了解UDP协议 二、了解端口和IP地址 三、套接字概述与Socket的概念 四、Socket的类型 五、 Socket的信息数据结构 六、网络字节序与主机字节序的互相转换 七、地址转换函数 八、UDP网络编程流程及相关函数 socket函数 bind函数 recvfrom函数 sendto函数 …...

基于模糊PID控制器的puma560机器人控制系统的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 PUMA 560机器人的数学模型 4.2 PID控制原理 4.3 模糊PID控制器的设计 5.完整工程文件 1.课题概述 基于模糊PID控制器的puma560机器人控制系统的simulink建模与仿真&#xff0c;对比传统的PID控制器…...

C语言文件操作超详解

文章目录 1. 为什么使用文件2. 什么是文件2. 1 程序文件2. 2 数据文件2. 3 文件名3. 二进制文件和文本文件? 4. 文件的打开和关闭4. 1 流和标准流4. 1. 1 流4. 1. 2 标准流 4. 2 文件指针4. 3 文件的打开和关闭 5. 文件的顺序读写5. 1 顺序读写函数介绍5. 2 对比一组函数: 6. …...

表字段显示tip

需求背景&#xff1a; 生成的报表&#xff0c;前端只展示字段名称&#xff0c;计算逻辑没有解释&#xff0c;使用方频繁“骚扰”&#xff0c;实在受不了&#xff0c;增加一个字段tip&#xff0c;实现效果&#xff08;下图&#xff09;&#xff1a; 代码 结合使用el-table-colu…...

十二、享元模式

文章目录 1 基本介绍2 案例2.1 Digit 接口2.2 Color 枚举2.3 BigDigit 类2.4 DigitFactory 类2.5 Client 类2.6 Client 类的测试结果2.7 总结 3 各角色之间的关系3.1 角色3.1.1 Flyweight ( 抽象享元 )3.1.2 ConcreteFlyweight ( 具体享元 )3.1.3 UnsharedFlyweight ( 非享元 )…...

黑马Java零基础视频教程精华部分_18_Arrays各种方法

系列文章目录 文章目录 系列文章目录Arrays简介Arrays各种方法toString代码示例binarySearch代码示例copyOf代码示例copyOfRange和fill代码示例sort代码示例 Arrays简介 操作数组的工具类。 Arrays各种方法 toString代码示例 int[]arr{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //to…...

RAG私域问答场景超级详细方案(第一期方案)[1]:工业级别构建私域问答(知识处理、知识召回排序、搜索问答模块)

RAG私域问答场景整体夏详细方案(第一期方案):工业级别构建私域问答(知识处理、知识召回排序、搜索问答模块) 大模型性能的跳阶式增长给文本摘要、信息检索、信息抽取、语义问答等自然语言处理任务带来了卓越的性能提升。同时,LangChain 作为一种基于 LLM 的框架,能够快速…...

【AI在医疗领域的应用】AI在疾病诊断、个性化治疗等领域的应用

AI在医疗领域的应用 AI在疾病诊断、个性化治疗等领域的应用 引言 人工智能&#xff08;AI&#xff09;技术正在迅速改变各个行业&#xff0c;而医疗领域无疑是AI应用最广泛、影响最深远的领域之一。AI在医疗中的应用不仅能够提高诊断的准确性和效率&#xff0c;还为个性化治疗…...

SpEL结合AOP示例

AOP不用多说&#xff0c;是spring框架的两大基石之一。SpEL是Spring Expression Language的缩写&#xff0c;意为Spring表达式语言&#xff0c;&#xff0c;其支持在运行时查询和操作对象图提供了更加丰富的功能&#xff0c;最特别的是方法调用与字符串模板功能。熟悉js的es6语…...

【Linux:环境变量】

目录 命令行参数&#xff1a; 环境变量&#xff1a; 命令行参数&#xff1a; argv是一个char*类型的数组&#xff0c;里面存放着字符、字符串的指针地址&#xff0c;且该数组必定是以NULL结尾 命令行中启动的进程都是Bash的子进程&#xff0c;命令行参数的存在本质上就是通过…...

8月9日笔记

8月9日笔记 什么是代理? “代理”通常指的是“网络代理”&#xff0c;它是一种特殊的网络服务&#xff0c;允许一个网络终端&#xff08;一般为客户端&#xff09;通过这个服务与另一个网络终端&#xff08;一般为服务器&#xff09;进行非直接的连接。代理服务器作为中间人…...

API 签名认证:AK(Access Key 访问密钥)和 SK(Secret Key 私密密钥)

API签名认证 在当今的互联网时代&#xff0c;API作为服务与服务、应用程序与应用程序之间通信的重要手段&#xff0c;其安全性不容忽视。你是否遇到过需要在HTTP请求中加入访问密钥(ak)和私密密钥(sk)的情况&#xff1f;是不是担心这些敏感信息会被拦截或者泄露&#xff1f;本…...

Redis 单机和集群环境部署教程

目录 一、Redis 单机环境部署1. 环境准备2. 安装 Redis2.1 安装依赖2.2 下载并编译 Redis2.3 配置 Redis2.4 设置 Redis 为系统服务 3. Redis 配置选项详解4. 注意事项 二、Redis 集群环境部署1. 环境准备2. 安装 Redis3. 配置 Redis 集群3.1 配置文件调整3.2 启动 Redis 实例3…...

华为hcip-big data 学习笔记《一》大数据应用开发总指导

一、大数据应用开发总指导 1. 前言 随着大数据技术的飞速发展和大数据应用的不断普及&#xff0c;大数据已经成为当今时代最热门的话题之一。不过对于大数据的了解&#xff0c;很多人还只是停留在表面&#xff0c;提到大数据&#xff0c;很多人只是直到它是最新的科技&#x…...

用户画像架构图

背景 本文讲述下实现一个画像平台的架构图 架构图 这里面的人群圈选我们这里主要采用ck和spark&#xff0c;不过也有很多使用es&#xff0c;如果使用es的话&#xff0c;需要把标签的数据也存储到es的表中&#xff0c;类似我们这里放到ck的表中一样&#xff0c;这样就可以通过…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...