首页 > 其他分享 >随想录(锁的来由和使用)

随想录(锁的来由和使用)

时间:2022-11-23 11:35:13浏览次数:51  
标签:抢占 代码 随想录 互斥 线程 使用 多线程


    对于开发系统级别软件的朋友来说,无论你是主动的还是被动的,锁的应用都是少不了的。很多人用锁,可是却未必知道锁的前世今生,什么时候用锁,什么时候不用锁?该用什么样的锁?今天我们就来对这个问题说道说道。


    (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)在锁中使用指针需要十分小心





标签:抢占,代码,随想录,互斥,线程,使用,多线程
From: https://blog.51cto.com/feixiaoxing/5880706

相关文章

  • 随想录(编写用户侧定时器)
       定时器是我们在平时开发中经常使用到的工具,特别是在协议的编写上更是必不可少的组成部分。虽然系统本身给我们提供了定时器,但是有的时候,我们也想自己编写一个粗粒度......
  • 随想录(为什么循环队列具有先天的并行性)
       循环队列是很多人喜欢用的一种数据结构。本着先来先服务的特性,循环队列是一种十分简单、健壮的数据结构。不像链表、二叉树,如果使用不慎,就会造成很大的麻烦,但是在循......
  • 随想录(linux下的pv操作)
         关于pv操作部分的内容,其实算不上什么新的东西。但是它对于我们理解信号量、消息处理部分的工作还是有很大帮助的。之前我们给出了一个win32的处理方案,但是实现的......
  • 随想录(写给那些学校不是985、211的同学们)
       每年的6、7月份都是一年一度的毕业季。按照某些新闻机构的统计数字来说,现在每一年毕业的人数达到了600万之多。然而随着社会经济的放缓、贫富差距的拉开,找工作变得越......
  • 随想录(用memmove函数代替strncpy函数)
        有过C语言编程的朋友应该都有过指针越界的困扰。不管越界的地方是全局地址、还是局部地址,查起来都是非常麻烦,原因大多时候都来自于自己对char数组类型的误用。很多......
  • 随想录(编写简单资源管理代码)
      不管编写什么软件,我们都会涉及到模块的编写。说是模块,其实就是管理一片资源,这些资源的概念很广,可以是内存、锁、socket、字符串、文件、空间大小等等。所以不管是什么......
  • 随想录(设计软件模块的接口)
       开发软件是一件复杂而且辛苦的工作,不同的模块之间的逻辑需要考虑,应用层与底层的关系也需要考虑。模块之间的关系处理不好,就会给软件的编写质量带来影响。当然不管软......
  • CUDA中threadIdx、blockIdx、blockDim和gridDim的全称以及使用
    threadIdx是threadindex线程索引缩写blockIdx是blockindex块索引缩写blockDim是block dimension块维度缩写gridDim是grid dimension网格纬度缩写使用可参考cud......
  • 随想录(矩阵计算的几种方法)
    【声明:版权所有,欢迎转载,请勿用于商业用途。】   要进行图像处理,矩阵运算是少不了的。不管是加减乘除,还是旋转、求逆、矩阵分解,都需要lib来好好支持。下面,主要就说一......
  • 随想录(机器学习的生产应用)
    【声明:版权所有,欢迎转载,请勿用于商业用途。     从范围上讲,人工智能>机器学习>模式识别。最近机器学习愈演愈烈,特别是深度学习的发展,极大的推动了机器学习的应......