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

边栏推荐
猜你喜欢

Huawei 14 Days - (3) Kernel Development

High Numbers|Calculation of Triple Integral 3|Uncle High Numbers|Handwritten Notes

2022年最新甘肃建筑施工焊工(建筑特种作业)模拟题库及答案解析
综合练习——三子棋小游戏

微信小程序获取手机号getPhoneNumber接口报错44002

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

决策树原理及代码实现

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

shell编写规范和变量

全网最强 JVM 来袭!(至尊典藏版)
随机推荐
容器化 | 在 Rancher 中部署 MySQL 集群
Hell Diggers Series #1
全国双非院校考研信息汇总整理 Part.3
综合练习——三子棋小游戏
Why does LabVIEW freeze when saving a VI
Design for failure 12 common design ideas
SQL Server、MySQL主从搭建,EF Core读写分离代码实现
MySQL active/standby switch
JSON.parseObject 带泛型告警
环形链表(LeetCode 141、142)
437. 路径总和 III ●●
重写并自定义依赖的原生的Bean方法
深度学习的随机种子
DNA脱氧核糖核酸修饰四氧化三铁|DNA修饰氧化锌|使用方法
MySQL函数(经典收藏)
devops学习(五) Jenkins 简单完成持续部署
The latest Gansu construction welder (construction special operation) simulation question bank and answer analysis in 2022
Mysql8.0新特性之详细版本
Gao Shu Xia|Triple Integral Exercises|Uncle Gao Shu|Handwritten Notes
Tkinter:功能按钮Button