信号量的应用:利用信号量实现进程互斥

article/2025/8/26 10:17:50

设置互斥信号量 

下面进行详细解释

 

1. 信号量定义与初始化

semaphore mutex;
mutex = 1; // 初始化为1
  • 信号量定义semaphore 是定义信号量的类型 ,这里定义了一个名为 mutex 的信号量。信号量是一种用于实现进程同步与互斥的机制,本质上是一个特殊变量 。
  • 初始化:将 mutex 初始化为 1 。在进程互斥场景中,信号量初始值为 1 表示临界区当前没有被占用,处于可用状态 。这就好比一间只有一个位置的小房间(临界区),一开始没人(信号量值为 1 ,表示空闲 ) 。

2. 循环结构

while (1)
{// 相关操作
}

while (1) 是一个无限循环,表示进程会不断重复执行循环内的操作 。因为进程在实际运行中,可能会多次需要进入临界区获取资源或执行关键代码,所以用无限循环来模拟这个持续的过程 。就像一个人可能会多次需要进入小房间做事情 。

3. wait 操作

wait(mutex);

wait 操作是信号量机制中的一个原语 ,也称为 P 操作。当进程执行到 wait(mutex) 时:

  • 首先会将信号量 mutex 的值减 1 ,即 mutex = mutex - 1 。
  • 然后检查 mutex 的值 ,如果 mutex 的值大于等于 0 ,说明在执行 wait 操作前,临界区是空闲的或者虽然有进程在使用临界区,但还有剩余的 “进入许可”(这里信号量值大于 0 ,可以理解为有额外的进入许可 ) ,那么当前进程可以进入临界区 ;如果 mutex 的值小于 0 ,说明在执行 wait 操作前,临界区已经被其他进程占用,没有剩余的 “进入许可” 了,此时当前进程会被阻塞 ,放入与该信号量相关的等待队列中,等待其他进程释放临界区资源 。这就好比一个人到小房间门口,先看有没有人,如果没人或者有多余的进入机会(信号量大于等于 0 ) ,就可以进去;如果已经有人在里面(信号量小于 0 ) ,就得在门口等着 。

4. 临界区

临界区;

临界区是指进程中访问临界资源的那段代码 。临界资源是一次仅允许一个进程访问的资源,比如共享变量、文件等 。在这个小房间(临界区)里,进程可以对共享资源进行操作 ,比如读取或修改共享变量的值 。由于同一时间只能有一个进程进入临界区,所以保证了对临界资源访问的安全性和一致性 ,避免多个进程同时访问临界资源导致数据混乱 。

5. signal 操作

signal(mutex);

signal 操作是信号量机制中的另一个原语 ,也称为 V 操作。当进程执行完临界区的操作后,会执行 signal(mutex) :

  • 首先将信号量 mutex 的值加 1 ,即 mutex = mutex + 1 。
  • 然后检查 mutex 的值 ,如果 mutex 的值大于 0 ,说明在执行 signal 操作前,没有进程在等待进入临界区 ,只是简单地释放了一个 “进入许可” ;如果 mutex 的值小于等于 0 ,说明在执行 signal 操作前,有进程因为等待进入临界区而被阻塞在等待队列中 ,此时会从等待队列中唤醒一个进程 ,让其有机会进入临界区 。这就好比一个人从小房间出来后(执行完临界区操作 ) ,告诉在门口等待的人(等待队列中的进程 ) ,现在可以进去了(唤醒等待的进程 ) 。

6. 剩余区

剩余区;

剩余区是进程中除临界区以外的代码部分 。在进程执行完临界区的操作,释放临界区资源(执行 signal 操作 )后,就进入剩余区执行其他非关键代码 。这部分代码不涉及对临界资源的访问,所以多个进程可以并行执行剩余区的代码 。就像一个人从小房间出来后,去做其他不影响小房间使用的事情 。

总体而言,这段代码通过信号量 mutex 以及 wait 和 signal 操作,实现了多个进程对临界区的互斥访问 ,保证了同一时间只有一个进程能够进入临界区访问临界资源 。


http://www.hkcw.cn/article/KUxQWmgJIS.shtml

相关文章

多模态大模型:开启智能决策的新时代

想要掌握如何将大模型的力量发挥到极致吗?叶梓老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具。 1小时实战课程,您将学习到如何轻松上手并有效利用 Llama Factory 来微调您的模型,以发挥其最大潜力。 CSDN教学平台录播地址…

python模块和包

模块 Python模块(Module) 是一个Python文件,以.py结尾,模块能定义函数、类和变量,模块里也能包含可执行的的代码 每一个模块都能帮助我们快速的实现一些功能,比如实现和时间相关的功能就可以使用time模块,我们可以认…

《仿盒马》app开发技术分享-- 订单列表页(端云一体)

开发准备 上一节我们实现了订单详情的展示,但是我们的确认订单页面只在下单成功后才会出现供用户查看,现在我们要有一个常驻的入口让用户去随时查看自己的订单以及订单状态,订单状态分为多个,还需要给用户提供切换的功能 功能分…

【第3章 文本】3.3 文本的定位

文章目录 水平与垂直定位示例textAligntextBaseline 将文本居中文本的度量绘制坐标轴旁边的文本标签在圆弧周围绘制文本 水平与垂直定位 在canvas中使用 strokeText() 或 fillText() 绘制文本时,需要指定所绘文本的 X 和 Y 的坐标,然而,浏览…

C++哈希

一.哈希概念 哈希又叫做散列。本质就是通过哈希函数把关键字key和存储位置建立映射关系,查找时通过这个哈希函数计算出key存储的位置,进行快速查找。 上述概念可能不那么好懂,下面的例子可以辅助我们理解。 无论是数组还是链表,查…

Java中的设计模式实战:单例、工厂、策略模式的最佳实践

Java中的设计模式实战:单例、工厂、策略模式的最佳实践 在Java开发中,设计模式是构建高效、可维护、可扩展应用程序的关键。本文将深入探讨三种常见且实用的设计模式:单例模式、工厂模式和策略模式,并通过详细代码实例&#xff0…

QT6搭建和使用MQTT

QT6搭建和使用MQTT 1.搭建MQTT环境1.下载源码2.CMake 编译 Qt MQTT 模块3.添加QT MQTT模块4.验证测试 2.MQTT的使用 1.搭建MQTT环境 1.下载源码 1.在GitHub下载对应qt版本的源码 git clone git://code.qt.io/qt/qtmqtt.git -b 6.5.3 这里以6.5.3版本的为例。 这里使用的是VS…

深入了解 C# 异步编程库 AsyncEx

在现代应用程序开发中,异步编程已经成为提升性能和响应能力的关键,尤其在处理网络请求、I/O 操作和其他耗时任务时,异步编程可以有效避免阻塞主线程,提升程序的响应速度和并发处理能力。C# 提供了内建的异步编程支持(通…

使用 Azure DevOps 管道部署到本地服务器

Azure DevOps 是一个帮助改进 SDLC(软件开发生命周期)的平台。 在本文中,我们将使用 Azure Pipelines 创建自动化部署。 Azure DevOps 团队将 Azure Pipelines 定义为“使用 CI/CD 构建、测试和部署,适用于任何语言、平台和云平台”。 在这里,我将解释如何在 Azure Dev…

NSSCTF-[青海民族大学 2025 新生赛]wenshilou

下载附件得到jpeg图片 放到kali里面用binwalk命令进行分离 分离之后得到文件 点击zip文件里面有个flag,打开得到base64编码 直接放到随波逐流里面解码 得到flag NSSCTF{welcometoQinhaiminzudaxue}

React 编译器

🤖 作者简介:水煮白菜王,一位前端劝退师 👻 👀 文章专栏: 前端专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧和知识归纳总结✍。 感谢支持💕💕&#…

【机器学习基础】机器学习入门核心算法:K均值(K-Means)

机器学习入门核心算法:K均值(K-Means) 1. 算法逻辑2. 算法原理与数学推导2.1 目标函数2.2 数学推导2.3 时间复杂度 3. 模型评估内部评估指标外部评估指标(需真实标签) 4. 应用案例4.1 客户细分4.2 图像压缩4.3 文档聚类…

力扣热题100之二叉树的最大深度

题目 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 代码 方法一:递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightN…

【C++编程】C++学习笔记【更新ing】

C学习笔记 作者:齐花Guyc(CAUC) 文章目录 C学习笔记Chapter.1 面向对象编程(OOP)1.类(class)2.对象(object)3.封装(Encapsulation)4.继承(Inheritance&#…

华为OD机试真题——矩形相交的面积(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

STM32F407VET6学习笔记7:Bootloader跳转APP程序

boot跳转APP的程序 目录 Flash分区设定: 工程文件地址设置: Bootloader工程文件: 测试的APP程序工程文件: Bootloader跳转程序: APP程序: Flash分区设定: 参考手册的分区: 工程文件…

5.29 打卡

DAY 39 图像数据与显存 知识点回顾 图像数据的格式:灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 作业:今日代码较少,理解内容即可 # 打印一张彩色图像…

关于scrapy在pycharm中run可以运行,但是debug不行的问题

关于scrapy在pycharm中run模式可以运行,但是debug模式不行的问题 文章目录 关于scrapy在pycharm中run模式可以运行,但是debug模式不行的问题查了下原因 点击run就可以运行,但是debug就是运行不了 一点击debug就报这个错,也不知道啥…

第7讲、Odoo 18 源码深度分析

Odoo 作为全球知名的开源 ERP 系统,其底层架构由众多核心 Python 文件共同支撑。本文将围绕 Odoo 18 版本中 的 api.py、exceptions.py、fields.py、http.py、loglevels.py、models.py、netsvc.py、release.py、sql_db.py 等关键文件,进行源码结构与实现…

【春秋云镜】CVE-2022-26965 靶场writeup

知识点 网站的主题或者模块位置一般是可以上传文件的,不过一般为压缩包形式主题或者模块可以上github上找到和cms匹配的源码主题被解压后会放到加入到对应的文件夹中,而且还会自动执行对应的info.php文件(需要主题和cms配套才行)我这里取巧了&#xff0…