当前位置:网站首页>EA&UML日拱一卒-多任务编程超入门-(7)关于mutex,你必须知道的
EA&UML日拱一卒-多任务编程超入门-(7)关于mutex,你必须知道的
2022-07-29 23:40:00 【51CTO】
前一篇文章讲了一个故事,本文换一种方式继续说明。如果将两篇文章结合起来看,相信会更有趣。
这部分内容看起来简单,但却是经常出错的地方。
面临的问题
多线程同时操作一段数据时,线程调度由操作系统控制,在机器码层次进行,所以访问同一数据的多个任务(线程)的代码随机交替执行,从而导致任务(线程)间数据交换不能正常进行。
解决问题的方式
问题搞清楚以后,对策当然就是保证每个线程内操作数据的处理的完整性。但是C/C++中达成这个目标的手段不是将数据保护起来,而是限制操作数据的代码的同时执行。具体说,就是在开始执行操作数据的代码之前先通过mutex::lock方法锁定互斥量,然后执行对数据进行操作的代码。数据操作代码执行完了之后,再通过mutex::unlock释放互斥量。在互斥量的锁定期间其他线程无法锁定信号量。
由于操作系统可以保证同一时刻只有一个线程可以锁定成功,所以只要程序在所有操作同一数据的代码之前都有锁定互斥量的动作,结果上就可以保证同一时刻只有一段操作数据的代码可以执行,而不被其他操作改数据的代码打断。这样就间接保证了数据的完整性。
注意事项
根据上面的描述,可以知道,使用Mutex进行数据交互必须遵循以下原则:
- 所有操作数据的代码在执行之前必须首先尝试锁定同一个互斥量
- 只有在互斥量锁定成功的情况下才允许执行操作数据的代码
- 操作数据的代码执行以后,必须释放互斥量
如果在操作数据之前没有锁定互斥量的过程,或者锁定的是不同的互斥量,无论哪一种情况都达成不了同一时刻,只有一段代码执行的目标。
如果操作数据的代码执行之后没有释放互斥量,后续处理数据的代码将永远不能锁定互斥量,也就是说,后续的数据处理不能继续执行。
请按照上述原则在审视一下代码,主要关注mutex:
应该讲点原则
有一种说法,飞机是试飞员飞出来的,估计也会有很多人说,程序是程序员Debug出来的。这种观点作者实在是不敢苟同。多任务编程就是一个不能靠调试解决问题的例子。必须遵循上面的原则,否则的话程序的动作会有很大的不确定性。在开发的最后阶段,多任务相关的问题都会占有相当大的比例。那简直就是程序员的噩梦。
必须讲点原则。
写在文章的最后
本公共号的成长需要您的支持!
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

边栏推荐
猜你喜欢

MySQL函数(经典收藏)

Analysis of miscellaneous diseases such as DNS domain name hijacking in instant messaging mobile terminal development

树莓派上安装 wiringPi 2.6 解决 gpio readall 命令的错误

devops学习(八) 搭建镜像仓库---jenkins推送镜像

Design for failure常见的12种设计思想

纳米金颗粒修饰核酸产品|碳纳米管载核酸-DNA/RNA材料|解析说明

The Sandbox Partners with Gravity to Bring RO Ragnarok to the Metaverse

【openlayers】Map【1】

论文精读——YOLOv3: An Incremental Improvement

Raspberry pie wiringPi 2.6 installed on solving gpio readall command mistakes
随机推荐
种类并查集(反集),学习T宝代码
仿牛客论坛项目部署总结
C陷阱与缺陷 第4章 链接 4.2 声明与定义
子无序测试
logback过期日志文件自动删除
jenkins搭建部署详细步骤
指令集数据产品如何设计和实现报表协同系统——基于指令集物联网操作系统的工业协同制造项目开发实践
C陷阱与缺陷 第3章 语义“陷阱” 3.10 为函数main提供返回值
LabVIEW为什么在存储VI时死机
一文解答web性能优化
The Sandbox Partners with Gravity to Bring RO Ragnarok to the Metaverse
How to make labview an application (labview program recognizes shapes)
High - level - the rest - the client determine whether indexes exist
微信小程序获取手机号getPhoneNumber接口报错44002
JetsonNano learning (6) Big pits and solutions that Jetson stepped on___Continuously updated
2022年最新甘肃建筑八大员(材料员)模拟考试试题及答案
codeforces 线段树题单
Tkinter:功能按钮Button
Redis系列:高可用之Sentinel(哨兵模式)
devops学习(八) 搭建镜像仓库---jenkins推送镜像