锁的来由和使用

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

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

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-22 22:46:37

锁的来由和使用的相关文章

数据库锁的问题 insert where 的问题

问题描述 插入并发控制工作中碰到的问题工作环境中ge_money_details是会员的金钱表判断其余额时使用selectsum(money)fromge_money_details获取增加金额时#{money}为正数减少金额时#{money}为负数用以下SQL进行并发插入出现金额被减少为负数的情况<selectid="InsertMoneyDetailsByAccumulate"resultType="java.lang.Long"parameterType

CEO王佶揭天游公司高层矛盾来由:和信进,纷争起

8月13日天游集团CEO及法定代表人王佶先生接受了专访,他描述了天游公司遭到董事会"突然袭击"的情况,并揭开了天游公司高层矛盾的来由. 和信进,纷争起 天游公司成立于2004年,创始人包括邓润泽.王佶.郦彦卿.2006年5月接受了和信超媒体(Giga Media以下简称"和信")的投资,当时和信的持股比例为14%. 王佶表示他本人在当时就感觉有些尴尬:和信属于外资,而中国政府不允许外资在华运营游戏业务.考虑到份额只有14%,也不过问公司管理,最终还是将其当作风险投资

王玉锁:老牌富豪慈善晋级

王玉锁的财富人生越来越绚丽,他的慈善人生也已拉开帷幕,舞台上有他的激情与豪情,一切都如他当年创业一般 文 | <中国慈善家>记者 穆青 熊静如 王玉锁,一位低调的实力派企业家,在中国商界里虽称不上炙手可热,却是一位不折不扣的老牌富豪--几乎自打中国有了富豪榜开始,他便是各种榜单上的常客.早在<福布斯>2001年中国富豪榜上便名列55位,之后的每年,王玉锁的名字便年年不落地出现在各种富豪榜单上.近些年,他更是多次位列慈善榜单前列. 而在1995年时,刚三十出头的王玉锁,还完全没有现在

多线程中锁的实现.

*引用本文请注明来自 blog.csdn.net/wtz1985        所谓"锁",就是为了让自己独自占有空间,在自己没用完之前,不让别人来占用自己的资源.现在的操作系统,无论是WINDOWS,还是UNIX等其他操作系统.都采用多线程的环境.这极大提高了任务的执行速度,而且不会影响其他事务的执行.但是它们的执行是靠时间片的轮转的,如果某一个线程没有执行完,可它的时间片用完了,就会被挂起来,直到轮到它的下个时间片.假如继续让它们这么自由的,没有约束的执行命令,将会导致一种不可预见

[Java] 方法锁、对象锁和类锁的意义和区别

版权声明:请尊重个人劳动成果,转载注明出处,谢谢! 目录(?)[+] 首先的明白Java中锁的机制 synchronized  在修饰代码块的时候需要一个reference对象作为锁的对象.  在修饰方法的时候默认是当前对象作为锁的对象.  在修饰类时候默认是当前类的Class对象作为锁的对象.   线程同步的方法:sychronized.lock.reentrantLock分析 方法锁(synchronized修饰方法时) 通过在方法声明中加入 synchronized关键字来声明 synch

Hive事物和锁管理

摘自Hive技术文档,锁管理:https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions#HiveTransactions-LockManager 有几个参数需要修改下,使得Hive支持事物和并发: Lock Manager A new lock manager has also been added to Hive, the DbLockManager.  This lock manager stores all loc

互斥锁和条件变量

为了允许在线程或进程之间共享数据,同步时必须的,互斥锁和条件变量是同步的基本组成部分. 1.互斥锁 互斥锁是用来保护临界区资源,实际上保护的是临界区中被操纵的数据,互斥锁通常用于保护由多个线程或多进程分享的共享数据.一般是一些可供线程间使用的全局变量,来达到线程同步的目的,即保证任何时刻只有一个线程或进程在执行其中的代码.一般加锁的轮廓如下: pthread_mutex_lock() 临界区 pthread_mutex_unlock() 互斥锁API pthread_mutex_lock(pth

ios-iOS 开发 如何设置和获取锁屏的时间长短

问题描述 iOS 开发 如何设置和获取锁屏的时间长短 在ios开发中 如何代码设置锁屏的时间 以及获取设置的锁屏时间 解决方案 获取的时间 , 我是不知道!可以监听锁屏, 程序在前台,这种比较简单.直接使用Darwin层的通知就可以了: #import #define NotificationLock CFSTR("com.apple.springboard.lockcomplete") #define NotificationChange CFSTR("com.apple.

Win8锁屏使用技巧

  微软最新的Win8系统安装用户越来越多,初次使用Win8系统,给笔者印象最深刻的是极快的开机速度以及Win8锁屏界面.类似于安卓手机的锁屏界面,每次在启动电脑的时候都会看到Win8锁屏界面,不过默认的锁屏界面总觉得单调,因此在网上收集了一些比较实用的Win8锁屏使用技巧,这里拿出来与大家分享下. 一.在Win8锁屏壁纸上添加记事便签 我们可以在Win8锁屏界面上添加记事便签,很适合我们对一些需要工作的内容.备忘录信息填写上Win8锁屏记事便签中,效果如下图: 在Win8锁屏壁纸上添加记事便签