【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
对于开发系统级别软件的朋友来说,无论你是主动的还是被动的,锁的应用都是少不了的。很多人用锁,可是却未必知道锁的前世今生,什么时候用锁,什么时候不用锁?该用什么样的锁?今天我们就来对这个问题说道说道。
(1)为什么用锁?
之所以会用锁,其根本目的在于对公共资源的保护。比如说,我们希望对某些数据的操作是连贯的、具体的。否则,如果这些脏数据如果被再次引用的话,肯定会引发不可预计的故障。虽然从代码上看,我们的操作可能只是一条语句,但是它所对应的汇编操作很有可能是由几条命令合在一起完成的,所以中间发生任何的切换、中断都会出现问题。那么,有哪些变动会导致这种情况发生呢?其实也不复杂,主要就三种,
a)中断
b)抢占
c)smp
(2)哪些场景需要互斥处理?
上面说了三种情形,其实就是代码有可能被打扰的三种情况。首先,中断的发生是随机的,如果中断中使用了和内核段同样的数据,那么肯定会惹麻烦的。同样,抢占也是一个很重要的问题。所谓的抢占,其实就是说线程在中断返回、资源释放、抢占点有可能被系统切换出运行队列。有些时候,线程的数据可能需要与另外一个线程进行分享,如果我们此时不想和别人分享,那么关闭抢占就可以了,系统也不会进行线程调度处理了。最后一种是多cpu情形,本质上和多线程有关,不同的cpu运行不同的线程,所以对于数据的访问必须是互斥的,我们必须利用硬件提供的汇编语句来对代码进行互斥处理,自旋锁就是用的最多的一种方法。
(3)有哪些锁的使用方法?
为了提高数据的访问效率,人们设计了各种各样的锁。所有这些设计的目的只有一个,就是在保持数据正确性的条件下尽可能将锁造成的影响降到最小。这从linux内核发展的轨迹可以清晰地看出来,越是高级的锁,越是具有特定的应用场景,越需要小心处理。就我个人了解,当前使用较多的锁主要有下面几种:
a)关中断
b)禁止抢占
c)自旋锁
d)原子操作
e)读写锁
f)互斥量
g)信号量
h)事件
(4)使用锁需要注意些什么?
在所有代码里面,关于多线程的编写其实是很难的,主要是因为多线程考虑的情况多,另外一方面就是代码调试的难度很大,所以在模块设计的时候一定要慎重。在平时编写的时候,多用成熟代码,这样才会在软件质量上有所保障。不过,在锁的使用中,还是有一些规则是要注意的,比如,
a)中断的代码是不能使用带有schedule函数的锁
b)抢占只能防止本cpu上线程之间的互斥
c)使用自旋锁的代码段不能太长,否则影响系统性能
d)互斥量只能被本线程释放,在嵌入式实时系统中可能会遇到优先级反转的问题
e)使用信号量最合适的地方就是pv操作
f)原子锁计数比较合适
g)事件功能和网络编程中的select很像,可以响应多个情形,但是无法保证这些事件有序
h)锁成对使用、有序使用,做到这些可解决一大部分的死锁问题
i)没事别写多线程,就是写也先把单线程的代码完善好了再进行考虑和移植
j)在锁中使用指针需要十分小心
分享到:
相关推荐
代码随想录-八股文 pdf
知识星球⾥很多录友拿到了⼤⼚offer,包括科班 和 ⾮科班的,⽽他们的每⽇学习总结都是每⼀位准备求职的程序 员必备的内容,也是⾼频考点,⽽这些内容⼜经过了我(程序员Carl)精⼼挑选,所以都是精华中的精华。 录...
代码随想录算法PDF.rar
代码随想录算法PDF.zip
代码随想录-大厂八股文-面试
代码随想录 面试大厂八股文 手撕代码必备神器
软件随想录全集
代码随想录贪心算法知识,非常管用
代码随想录的pdf版本,不知道为啥放在电脑上面光删除不掉,所以网上保存一下下!
软件随想录 软件随想录 软件随想录 软件随想录 软件随想录
00.代码随想录-最强八股文-第3版-无密版本.pdf
「代码随想录」动态规划专题精讲(v1.2).pdf
代码随想录知识星球精华-大厂面试八股文v1.1.pdf
付费渠道买的,请珍惜
软件随想录_扫描版_5.79M
软件随想录
代码随想录是一个致力于帮助程序员提高编程能力的网站,提供了大量的题目和解题思路供学习和参考。本文主要介绍代码随想录的刷题笔记记录,方便读者更好地利用该网站进行学习。 ## 刷题笔记记录的作用 刷题笔记...
软件随想录.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
计算机教育_软件随想录_给计算机专业学子的建议知识.pdf
「代码随想录」程序员求职攻略