信号量Semaphore

FreeRTOS五种方式传递信号(队列,信号量,互斥量,事件组,任务通知) 在裸机编程中,一般信号传递都是全局变量,数组或者是返回值函数等等其他方式,在freertos中,我们不再使用裸机编程方式,而是使用统一的(五种)方式传递信号量,更加规范的,安全,传递(通知)信号。 阅读详情

首先也来看看如何使用信号量,信号量Semaphore常用有三个函数,使用很方便。下面是这几个函数的原型和使用说明。

第一个CreateSemaphore

函数功能:创建信号量

函数原型:

HANDLECreateSemaphore(

 LPSECURITY_ATTRIBUTESlpSemaphoreAttributes,

 LONGlInitialCount,

 LONGlMaximumCount,

 LPCTSTRlpName

);

函数说明:

第一个参数表示安全控制,一般直接传入NULL。

第二个参数表示初始资源数量。

第三个参数表示最大并发数量。

第四个参数表示信号量的名称,传入NULL表示匿名信号量。

 

第二个 OpenSemaphore

函数功能:打开信号量

函数原型:

HANDLEOpenSemaphore(

 DWORDdwDesiredAccess,

 BOOLbInheritHandle,

 LPCTSTRlpName

);

函数说明:

第一个参数表示访问权限,对一般传入SEMAPHORE_ALL_ACCESS。详细解释可以查看MSDN文档。

第二个参数表示信号量句柄继承性,一般传入TRUE即可。

第三个参数表示名称,不同进程中的各线程可以通过名称来确保它们访问同一个信号量。

 

第三个 ReleaseSemaphore

函数功能:递增信号量的当前资源计数

函数原型:

BOOLReleaseSemaphore(

 HANDLEhSemaphore,

 LONGlReleaseCount,  

 LPLONGlpPreviousCount 

);

函数说明:

第一个参数是信号量的句柄。

第二个参数表示增加个数,必须大于0且不超过最大资源数量。

第三个参数可以用来传出先前的资源计数,设为NULL表示不需要传出。

 

 

这里需要注意:当前资源数量大于0,表示信号量处于触发,等于0表示资源已经耗尽故信号量处于末触发。在对信号量调用等待函数时,等待函数会检查信号量的当前资源计数,如果大于0(即信号量处于触发状态),减1后返回让调用线程继续执行。一个线程可以多次调用等待函数来减小信号量。 也就是说信号量的增加与减少是靠ReleaseSemaphore 增加信号量是WaitForsingleObject WaitForMutiObject

 

最后一个 信号量的清理与销毁

由于信号量是内核对象,因此使用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_hThreadParameter;
CRITICAL_SECTION  g_csThreadCode;
int main()
{
	printf("     经典线程同步 信号量Semaphore\n");
	printf(" -- by MoreWindows( http://blog.youkuaiyun.com/MoreWindows ) --\n\n");

	//初始化信号量和关键段
	g_hThreadParameter = CreateSemaphore(NULL, 0, 1, NULL);//当前0个资源,最大允许1个同时访问
	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_hThreadParameter, INFINITE);//等待信号量>0
		++i;
	}
	WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);
	
	//销毁信号量和关键段
	DeleteCriticalSection(&g_csThreadCode);
	CloseHandle(g_hThreadParameter);
	for (i = 0; i < THREAD_NUM; i++)
		CloseHandle(handle[i]);
	return 0;
}
unsigned int __stdcall Fun(void *pPM)
{
	int nThreadNum = *(int *)pPM;
	ReleaseSemaphore(g_hThreadParameter, 1, NULL);//信号量++

	Sleep(50);//some work should to do

	EnterCriticalSection(&g_csThreadCode);
	++g_nNum;
	Sleep(0);//some work should to do
	printf("线程编号为%d  全局资源值为%d\n", nThreadNum, g_nNum);
	LeaveCriticalSection(&g_csThreadCode);
	return 0;
}

可以看出来,信号量也可以解决线程之间的同步问题。

由于信号量可以计算资源当前剩余量并根据当前剩余量与零比较来决定信号量是处于触发状态或是未触发状态,因此信号量的应用范围相当广泛。


 

信号量Semaphore详解 大家应该都用过关键字加锁,用来保证某个时刻只允许一个线程运行。那么如果控制某个时刻允许指定数量的线程执行,有什么好的办法呢?答案就是JUC提供的信号量Semaphore。Semaphore(信号量)可以用来限制能同时访问共享资源的线程上限,它内部维护了一个许可的变量,也就是线程许可的数量Semaphore的许可数量如果小于0个,就会阻塞获取,直到有线程释放许可Semaphore是一个非重入锁构造方法permits表示许可线程的数量fair表示公平性,如果设为true。 阅读详情

相关推荐

go的信号量semaphore

今天学习了go的信号量semaphore,因为之前学习过操作系统的pv操作,所以看这个东西,没有什么很难的地方 简单的记录一些学习笔记: 1、TryAcquire 和 Acquire 分别是不等待和等待 2、一开始看视频,以为collatzSteps是一个必须的东西,看不懂,后面理解了才知道,只是用这个模拟平时编程的任务而已,并不用太在意,这个函数是当奇数的时候,乘3+1;当是偶数的时候,除...

qq_34525938的博客 2194

linux 进程信号传递参数,Linux 通过信号机制在进程间传递参数中的几个主要函数解析...

1. sigqueue() 用于信号的发送函数功能:发送信号给特定的某个进程使用头文件:#include 函数原型:int sigqueue(pid_t pid, int sig, const union sigval value);参数:pid是指定接收信号的进程号;sig确定即将发送的信号;value是一个联合数据结构union sigval,指定了信号传递的参数,返回值:成功时,返回0;(信...

weixin_42131705的博客 904

Python:信号量semaphore

semaphone信号量 和Lock很像,信号量对象内部维护一个倒数计数器,每一次acquire都会减1,当acquire方法发现计数为0就阻塞请求的线程,直到其他的线程对信号量release后,计数大于0,恢复阻塞的线程 名称 含义 Semaphore(value=1) 构造方法。value小于0,抛ValueError异常 acquire(blocking=True,timeout=None) 获取信号量,计数器减1,获取成功返回True releas...

二十四桥明月夜 1159

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

原文地址:http://blog.youkuaiyun.com/morewindows/article/details/7481609   前面介绍了关键段CS、事件Event、互斥量Mutex在经典线程同步问题中的使用。本篇介绍用信号量Semaphore来解决这个问题。 首先也来看看如何使用信号量,信号量Semaphore常用有三个函数,使用很方便。下面是这几个函数的原型和使用说明。 第一个

Mr_SGQ的专栏 784

【JUC】信号量Semaphore详解

大家应该都用过关键字加锁,用来保证某个时刻只允许一个线程运行。那么如果控制某个时刻允许指定数量的线程执行,有什么好的办法呢?答案就是JUC提供的信号量Semaphore。Semaphore(信号量)可以用来限制能同时访问共享资源的线程上限,它内部维护了一个许可的变量,也就是线程许可的数量Semaphore的许可数量如果小于0个,就会阻塞获取,直到有线程释放许可Semaphore是一个非重入锁构造方法permits表示许可线程的数量fair表示公平性,如果设为true。

BASK2311的博客 1474

MATLAB新手必看:Stewart平台运动学逆解从入门到实战(附完整代码)

本文详细介绍了如何使用MATLAB实现Stewart平台的运动学逆解,从基础原理到完整代码实现,涵盖并联机器人的数学建模、MATLAB编程和Simulink集成。通过实战案例和可视化分析,帮助新手快速掌握Stewart平台的运动学逆解技术,适用于机器人学和控制理论领域的研究与应用。

dream的博客 551

进程间通信(三)---- 信号量

信号量的本质是一种数据操作锁,本身不具有数据交换的功能,而是通过控制其他的共享资源(如共享内存)来实现进程间通信,其本身只是一种外部资源的标识,负责保证进程间通信的同步与互斥机制 生命周期不随进程,随内核(与消息队列类似),也存在两个命令ipcs -s(查看系统中的信号量);ipcrm -s semid(释放指定信号量) 所谓同步与互斥机制,互斥表示对于某一公共资源(也叫临界资源),在

chenkaixin_1024的博客 449

深入解析STM32F103R6的USB OTG_FS双重角色设备(DRD)设计与应用

本文深入解析了STM32F103R6的USB OTG_FS双重角色设备(DRD)设计与应用。详细阐述了其作为USB主机和设备双重角色的硬件设计要点,包括VBUS电源管理与ID引脚配置,并提供了设备模式(如虚拟串口CDC)与主机模式(如读取U盘文件)的软件实现实战指南,帮助开发者充分发挥该芯片的OTG潜力。

weixin_29195615的博客 265

信号量 Semaphore

信号量 Semaphore 1. 简介 信号量 Semaphore 是一个控制访问多个共享资源的计数器,和 CountDownLatch 一样,其本质上是一个“共享锁”。 一个计数信号量。从概念上讲,信号量维护了一个许可集。 如有必要,在许可可用前会阻塞每一个 acquire,然后再获取该许可。 每个 release 添加一个许可,从而可能释放一个正在阻塞的获取者。 但是,不使用实际的许可对...

木村的博客 1804

保姆级教程:在RK3588平台上为IMX415 Sensor配置HDR2曝光(附完整代码与避坑点)

本文提供RK3588平台上为IMX415 Sensor配置HDR2曝光的详细教程,涵盖基础概念、限制条件、实战配置步骤及常见问题解决方案。通过完整代码示例和关键参数解析,帮助开发者高效实现HDR2曝光模式,提升图像质量并避开常见陷阱。

weixin_28685287的博客 283

LNA设计学习心得记录----MOS管的选取

LNA设计学习心得---MOS管的选取仿真

weixin_40359668的博客 6127

Semaphore信号量

Semaphore信号量 - Semaphore 可以用来限制或管理数量有限资源的使用情况 - 信号量的作用是用来维护一个“许可证”,的计数,线程可以获取 许可证,那信号量剩余许可证就减一,线程也可以是否一个许可证,那剩余的许可证就加一,当信号量拥有的许可证为0时,那么下一个线程想获得许可证,就要进行等待,直到另外线程释放许可证 信号量使用流程 : 1.初始化Semaphore 并指定许可证的数量 : 2.在需要被现在的代码前加acquire() 或者 acquireUninterruptibly

浪人与酒 969

CRaxsRat v7.6 安装与使用教程(附工具下载)

摘要:本文介绍远程管理工具CRaxsRat v7.6的合法应用与基本操作,强调仅限授权环境使用。该工具支持多客户端管理、TLS加密及文件/进程控制等功能,适用于内网维护与安全测试。安装需Windows 10/11系统及.NET 4.8,步骤包括解压运行、配置监听端口及生成客户端。文中提醒防火墙设置与杀软误报问题,并重申禁止非法用途,建议在虚拟机或隔离环境学习使用。

lzj781210的博客 3791

C++ Semaphore信号量使用

Semaphore信号量 主要用于线程同步,多个线程同时访问一个方法时,如何保证访问有序,不出现紊乱的情况下,就可以使用 Semaphore信号来避免这一问题。 使用步骤: 1.创建信号量:HANDLE WINAPI CreateSemaphoreW( __in_opt LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, __in LONG lInitia...

MusicMan 5128

解决nfs挂载根文件系统报错:VFS: Unable to mount root fs via NFS, trying floppy.

解决nfs挂载根文件系统报错的问题:VFS: Unable to mount root fs via NFS, trying floppy.

汉尼拔勇闯天涯 4573

【unity小技巧】新输入系统InputSystem游戏运行中改键重新绑定控制按键(最全最完美解决方案)

在游戏开发中,控制输入是至关重要的一环。Unity的新输入系统(Input System)为开发者提供了强大的工具来管理和处理用户输入,不仅支持各种平台上的多种输入设备,还能轻松处理复杂的输入操作和映射。本文将深入探讨如何使用Unity的新输入系统重新绑定控制按键,为开发者提供一套全面且完善的解决方案。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 7358

java并发之信号量Semaphore原理

1. 信号量Semaphore的介绍我们以一个停车场运作为例来说明信号量的作用。假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦。以后来的车必须在入口等待,直到停车场中有车辆离开。这时,如果有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开一辆,则又可以放入一辆,如此往复。 在这个停车场系统中,车位是公共资源,每辆车好比...

weixin_34168880的博客 2575

YOLOv13添加DRB模块map暴涨12.33!准确率提升8.56!召回率提升15.66

本文介绍了在YOLOv13模型中添加DRB模块的改进方法。实验结果显示,添加DRB模块后模型性能显著提升,mAP暴涨12.33%,准确率提升8.56%。文章详细说明了移植过程,包括创建yolov13-DRB.yaml配置文件、修改tasks.py和__init__.py文件,以及引入UniRepLKNet模块的具体实现。其中重点描述了GRNwithNHWC、NCHWtoNHWC等核心组件的实现细节,并提供了完整的模型结构配置代码。这些改进使得YOLOv13模型在保持原有架构优势的同时,获得了更强大的特征提取

FJN110的博客 2819

java信号量Semaphore

简介 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。 一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaph...

qq_35967283的博客 378

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Semaphore 信号量简单示例

Semaphore是一个计数信号量,它的本质是一个"共享锁"。 信号量维护了一个信号量许可集,Semaphore可以控同时访问的线程个数,线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。 10个线程 抢占5个信号量许可 package ...

ZeWe的博客 355

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

信号量Semaphore 的故事

信号量Semaphore 的故事 import org.junit.Test; import java.util.concurrent.Semaphore; /** * @describe: 信号量 Semaphore 的使用 * @author: morningcat.zhang * @date: 2019/2/14 10:05 PM */ public class Semaphore...

晨猫 188

Java - Semaphore信号量浅析

文章目录一、什么是信号量二、信号量有什么用三、信号量怎么用四、tryAcquire和acquire的区别 一、什么是信号量 Semaphore存在于java.util.concurrent(java并发)包下,,是一个计数信号量,维护了一个许可的集,若有必要,会在获取许可前阻塞每一个线程。 二、信号量有什么用 假想在服务器上运行着若干线程,这些线程需要连接到同一数据库,但任一时刻只能获得一定数目的数据库连接。要怎样才能够有效地将这些固定数目的数据库连接分配给若干线程? 方案一:给方法加锁,那样从始至终只会有

xunming的专栏 535

Semaphore 信号量

Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁"。 信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。 Semaphore的函数列表 // 创建具有给定的许可数和非公平的公平设...

weixin_38982591的博客 266
上一篇: windows同步对象小结
下一篇: 关键段,事件,互斥量,信号量的“遗弃”问题
雪岢奇
博客等级 码龄17年 310粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值