信号量 Semaphore 用法及注意事项总结

2023-05-16

信号量

信号量在WIN32系统中是核心对象,故其用法同其他同步机制类似,但可应用于多个线程同步运行,即同时有至多有限个线程同时工作,而线程上线数量取决于初始化时指定的最大值。

1.创建一个信号量
创建时初始值不要超过信号量最大限度。
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName
);

***例子:HANDLE HS=CreateSemaphore(NULL,0,2,NULL);***//0:初值 2:最大值

2.获得信号量锁定
因为Semaphore是核心对象,所以可以用WaitForSIngleObject()获得锁定,但一次只能锁定一个。对单个 线程来说,其可以用Wait多次锁定,也可以用Release一次释放多个,但有一点,不要释放超过最大限度。

3.解除信号量锁定
程序获得信号量后应当在结束同步控制时将其释放掉。就像退出临界区一样。
解除信号量锁定时尽量一次释放一个,虽然一次可释放多个,但容易出现不可预料的情况,就像最下面的程序例子。
BOOL ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount
);
例:ReleaseSemaphore(HS,1,NULL);

信号量程序实例:现在创建多个线程使用同一信号量,让其打印出1来,观察打印结果,总结规律。程序思路:创建一个信号量,通常其初始值为0,然后释放掉一个信号量,于是Wait函数返回,最先等待的线程将开始运行。在打印完1后释放掉2个信号值,接着会有两个线程开始运行,如细胞分裂,其打印个数将会以2倍速度扩张。但初始信号量最大值被 设定为2个,却有多个(为用户指定个数)打印1,因为这一设定,程序可被 组织成各种各样的同步机制。
代码:

#include<stdio.h>
#include<windows.h>
HANDLE HC1;
DWORD WINAPI FUN1(LPVOID P)
{
	while(1)
	{
		WaitForSingleObject(HC1,INFINITE);
		printf("1");
		Sleep(1000);
		ReleaseSemaphore(HC1,2,NULL);
	}
	return 0;
}

DWORD WINAPI FUN2(LPVOID P)
{
	while(1)
	{
		printf("\n");
		Sleep(990);
	}
	return 0;
}

int main()
{
	int i;
	printf("请输入你要同时打印的线程个数:");
	scanf("%d",&i);
	HC1=CreateSemaphore(NULL,0,2,NULL);
	ReleaseSemaphore(HC1,1,NULL);
	CreateThread(NULL,0,FUN2,NULL,0,NULL);
	while(i--)
	{
		CreateThread(NULL,0,FUN1,NULL,0,NULL);
	}
	Sleep(INFINITE);
	return 0;
}

运行截图:
在这里插入图片描述
分析:申请了10个线程,但信号量最大值为2,一个循环一次申请一个,却释放两个,最终所有线程都有了信号,但却同时最多有10个线程在打印1,所以说ReleaseSemaphore用不好是非常可怕的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

信号量 Semaphore 用法及注意事项总结 的相关文章

  • layui实现文件分片上传

    html代码 lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt layui lt title gt lt meta
  • C++ day42 C++的其他类库(除STL外)

    STL已经提供了一个非常好的可重用代码源 xff0c STL工具可以被用来解决很多编程问题了 xff0c 但是C 43 43 还是觉得不够 xff0c 在STL之外 xff0c 也提供了一些模板类 xff0c 这些模板类基本都是用来做一件很
  • python爬虫beautifulsoup详细教程

    BeautifulSoup4是爬虫必学的技能 BeautifulSoup最主要的功能是从网页抓取数据 xff0c Beautiful Soup自动将输入文档转换为Unicode编码 xff0c 输出文档转换为utf 8编码 Beautifu
  • pandas用法详解

    一 生成数据表 1 首先导入pandas库 xff0c 一般都会用到numpy库 xff0c 所以我们先导入备用 xff1a import numpy as np import pandas as pd 2 导入CSV或者xlsx文件 xf
  • 程序员读书顺序!

    程序猿的读书历程 xff1a xx语言入门 gt xx语言应用实践 gt xxx语言高阶编程 gt xxx语言的科学与艺术 gt 编程之美 gt 编程之道 gt 编程之禅 gt 颈椎病康复指南
  • 基于STM32的倾斜仪设计(二)—— 硬件设计(2)

    2 4控制电路 本实验中选用的控制核心是STM32系列单片机 xff0c 具体型号为STM32F103R8T6 STM32F103R8T6是一款嵌入式 微控制器集成电路 xff0c 是ST旗下的一款常用的增强型系列微控制器 此芯片工作电压为
  • win32多媒体定时器

    win32多媒体定时器 因为编程需要以1ms为周期调用一个函数 xff0c 故在Windows平台上测试了一些定时器 xff0c 并进行比较 xff0c 最终选用timeSetEvent作为最终选项 几个拉跨的定时器精度 select选择模
  • 树莓派005_L298N电机控制板

    硬件接口 ENA IN1 IN2 控制左边的电机A xff0c ENB IN3 IN4控制右边的电机B 以上六个全部接GPIO口 xff0c 可通过pwm控制ENA ENB实现调速 43 12V为外接电源正极接入口 GND为外接电源负极接入
  • Vue实现Enter键查询

    单个条件 xff1a 64 keyup span class token punctuation span enter span class token punctuation span native span class token op
  • 图文详解教你在线换系统(无须U盘)

    1 先去msdn下载需要安装的系统 建议不要下载到系统盘 系统下载传送门 2 系统下载后 xff0c 双击打开找到setup xff0c 然后以管理员权限打开 3 打开windows安装界面后 xff0c 选择更改windows安装程序下载
  • 从零开始写一个图像处理程序之一(BMP彩色图转灰度图)

    图像二值化可以直接调用opencv的二值化函数去完成处理 xff0c 但是不利用OpenCV从头手写一个处理图片程序未尝不是一件有意思的事情 xff0c 就拿BMP图片为例去做一个 BMP图像 xff1a BMP xff08 Bitmap
  • 智能革命和未来社会《智能时代--大数据和智能革命重新定义未来》

    通过区块链 xff08 Block Chain xff09 在未来跟踪每一件商品从制造出来到被消费的完整行踪 比特币在一定程度上起到货币的作用 xff0c 并且成为全球很安全的洗钱工具 xff0c 源于它背后的一个技术 区块链 block即
  • Git 版本回退方法

    场景一 xff1a 如果想将代码恢复到之前某个提交的版本 xff0c 且那个版本之后提交的版本都不要了 xff0c 就可以使用 git rest 原理 xff1a git reset的作用是修改HEAD的位置 xff0c 即将HEAD指向的
  • Antd form表单的使用、设值、取值、清空值

    1 使用 this props form getFieldDecorator 34 key 34 lt Input gt 3 设值 this props form setFieldsValue key 39 123 39 2 取值 this
  • 静态类,方法,成员

    说起静态类 xff0c 你可能会联想到实例类 这两者并不难区分 xff0c 前者 静态类 只在内存中创建一个 xff0c 而后者 实例类 则是每次实例化后 xff0c 就会再内存创建一份 今天来简单聊一下静态类的理解 代码情景 xff1a
  • shell脚本批量执行可执行文件

    touch一个test sh文件 xff0c 按下方例子vim写入 xff1a span class token comment bin bash span span class token function echo span span
  • git 本地改动了,不保留,直接拉取线上最新代码

    如果您在本地做了改动 xff0c 但是又不想保留这些改动 xff0c 可以使用以下命令强制拉取远程最新代码 xff0c 覆盖掉本地代码 xff1a span class token function git span fetch all s
  • C语言创建单链表

    单链表 链表是一种物理存储单元上非连续 非顺序的存储结构 xff0c 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表由一系列结点 xff08 链表中每一个元素称为结点 xff09 组成 xff0c 结点可以在运行时动态生成 每个结
  • kvaser二次开发

    总结归纳 xff1a 实施步骤 xff1a 通过浏览网上的大量关于can总线开发的资料 xff0c 建立起对can总线软件开发的大致流程记录优质资料将开发过程流程化通过官方资料研究技术细节开工 技术要点 xff1a can协议 xff0c
  • vue瀑布流布局插件vue-masonry

    插件npm网址 https www npmjs com package vue masonrygithub xff1a https github com shershen08 vue masonry安装 npm install vue ma

随机推荐

  • 双目视觉——点云与RGB图像融合

    目录 一 固定向量类1 cv Vec2 读取像素 二 点云着色四 结果展示1 图像2 点云3 彩色点云 五 参考链接 一 固定向量类 1 cv Vec 在OpenCV中针对三通道矩阵 xff0c 定义的Vec类型有 xff1a cv Vec
  • PX4二次开发环境搭建及报错解决(v1.9.2)

    PX4二次开发环境搭建及报错解决 xff08 v1 9 2 xff09 正文脚本安装方式手动安装编译环境 网上之前已经有很完善的环境搭建教程了 xff0c 但是大多是支持v1 8 0及之前版本的 xff0c 但自从v1 9 0版本之后 xf
  • 双系统安装Ubuntu(16.04)(含重装教程)

    双系统安装Ubuntu xff08 16 04 xff09 正文制作启动盘给Ubuntu分硬盘空间安装Ubuntu系统 笔者之前装过Ubuntu的双系统 xff0c 现在是重装 xff0c 但本教程同时适用初次安装和二次安装的 xff0c
  • (五)通俗易懂理解——双向LSTM

    中文翻译作者博客 xff1a https www cnblogs com wangduo p 6773601 html utm source 61 itdadao amp utm medium 61 referral 英文原文作者网址 xf
  • linux服务器升级node版本

    最近部署前端代码时 xff0c 发现服务器node版本太低 xff0c 导致前端工程编译不成功 于是升级了一下 下载node安装包 这里我们在node官网下载LTS xff08 即当前稳定版本 xff09 xff0c 找到对应当前服务器环境
  • 【坐标转换】lla转换成enu坐标(无损版)

    import numpy as np import smpy utils as smpy utils import ditu topbind as tb from scipy spatial transform import Rotatio
  • C++ : 力扣_Top(62-84)

    C 43 43 力扣 Top 62 84 文章目录 C 43 43 力扣 Top 62 84 62 不同路径 xff08 中等 xff09 66 加一 xff08 简单 xff09 69 x的平方根 xff08 中等 xff09 70 爬楼
  • PID参数整定具体方法-圆周倒立摆

    0 前言 关于PID参数的整定 xff0c 网上调节的口诀 原则 方法满天飞 xff0c 但是并没有具体的到步的教程 xff0c 作为初学者且非自动化相关专业学生有点看不懂 一脸懵逼 xff0c 走了不少弯路 xff0c 呕心沥血才调节好
  • 将字符串逐一入队,再出队列输出。

    C语言 创建一个简单链式队列代码 xff1a 将字符串逐一入队 xff0c 再出队列输出 队列是一种特殊的线性表 xff0c 特殊之处在于它只允许在表的前端 xff08 front xff09 进行删除操作 xff0c 而在表的后端 xff
  • cmake find_package找不到opencv

    当然找不到opencv可能是你安装的时候修改了安装位置 而按逻辑讲 xff0c 我们想让程序找到我的文件位置 xff0c 我们可以事先给程序位置信息 在CMakeLists txt写上我们地opencv的build的位置 set OpenC
  • 【精华】ROS学习(二):Realsense ROS驱动安装

    文章目录 Realsense ROS驱动安装1 系统环境及安装准备2 安装Realsense SDK3 安装Realsense ROS4 异常问题 1 异常问题1 2 异常问题2 Realsense ROS驱动安装 1 系统环境及安装准备
  • 20210202 电脑端开移动热点(无需任何软件,WIN10自带)

    卸载掉第三方软件 刚刚试了下 xff0c 如果连不上 xff0c 有可能是因为有梯子的原因 xff0c 关掉就能上网 或者先连上 xff0c 再开梯子
  • ROS Message 类型总结

    文章目录 ROS Message 类型总结内置类型 1 常见类型 2 自定义msg消息1 添加 msg 文件2 package xml3 CMakeLists txt ROS Message 类型总结 ROS使用简化的消息描述语言来描述RO
  • PHP的TZ环境变量是干什么的?底层原理是什么?

    PHP的TZ环境变量用于指定系统时区 底层原理是 xff0c PHP运行时可以读取环境变量 xff0c 以便确定系统时区并在日期和时间函数中使用 具体地说 xff0c 当PHP运行时 xff0c 它会检查系统的TZ环境变量 如果该环境变量存
  • HTTP响应是干什么的?为什么需要HTTP响应?底层原理是什么?

    HTTP响应是指服务器对客户端的HTTP请求所作出的回应 xff0c 它包含了HTTP协议规定的响应状态码 响应头部以及响应内容三个部分 HTTP响应的作用是将服务器端处理后的数据或结果返回给客户端 客户端发送HTTP请求后 xff0c 服
  • PHP对变量进行赋值的过程底层经历了什么?底层原理是什么?

    在PHP中 xff0c 对变量进行赋值的过程包括以下步骤 xff1a 解析器检查语法 xff1a PHP代码在执行之前 xff0c 首先需要进行语法解析 解析器会检查代码是否符合语法规范 xff0c 如果出现语法错误 xff0c 解析器会发
  • PHP为什么需要字符串处理函数?底层原理是什么?

    PHP作为一种脚本语言 xff0c 经常需要处理字符串数据 字符串处理函数是用于对字符串进行操作和处理的一组函数 xff0c 包括字符串的截取 查找 替换 转换等等操作 底层原理是PHP内核通过字符指针和字符数组来存储和处理字符串 xff0
  • PHP为什么需要抛出异常?底层原理是什么?

    在编程过程中 xff0c 可能会出现一些意外情况或者错误 xff0c 这些错误需要被捕获并处理 异常是一种错误处理机制 xff0c 它可以在程序出现异常情况时中断程序的正常执行流程 xff0c 跳转到异常处理代码块 xff0c 避免程序因错
  • PHP的代码注入是什么意思?底层原理是什么?

    PHP的代码注入 xff08 Code Injection xff09 指的是攻击者通过构造恶意的输入 xff0c 在应用程序中注入一些非法的代码 xff0c 从而在应用程序中执行攻击者的指令或代码 这种攻击方式通常会利用应用程序的漏洞 x
  • 信号量 Semaphore 用法及注意事项总结

    信号量 信号量在WIN32系统中是核心对象 xff0c 故其用法同其他同步机制类似 xff0c 但可应用于多个线程同步运行 xff0c 即同时有至多有限个线程同时工作 xff0c 而线程上线数量取决于初始化时指定的最大值 1 创建一个信号量