临界区 ,互斥锁,自旋锁比较(CriticalSection ,Spinlock , MutexSem)

   网上看到一篇介绍以上三种锁的文章,写的很不错,翻译一下,顺便添加一些自己的见解。原文链接:http://modula2.org/sb/env/index35.htm

所有这些对象都是互斥对象。有一些差异,既明显又不那么明显。

CriticalSection

  • 快速在用户/内核态执行。(一般情况下在用户态执行,效率高)
  • 在单个进程中同步线程。(不可以跨进程同步数据)
  • 在获取到对象之前不会返回。(即阻塞等待)
  • 允许递归。
  • 高效地等待。

MutexSem

  • 没有那么快的执行。可能/必须转换到内核态。
  • 在一台计算机上同步多个进程中的线程。
  • 在获取到对象或达到给定的超时值之前不会返回。
  • 允许递归。
  • 可以在多种等待情况下使用。
  • 高效地等待

Spinlock 

  • 快速用户模态执行。
  • 在单个进程内同步线程,或在共享内存中同步多个进程。
  • 在获取到对象之前不会返回。
  • 不支持递归。
  • “等待”时消耗100%的CPU。

当您从多个位置调用代码时,CriticalSection和MutexSemobjects的递归功能非常重要。同一个线程对多次加锁这些对象做计数,只需要释放相同次数锁,知道引用计数为0就可以了。这可以使编写代码更容易,因为在调用将请求对象所有权的过程时,您不必担心对象是否已由线程拥有。只要加锁的所有代码也释放它,您就是安全的。关于所有权递归有两个观点。有人说这没关系,也没有说出来。

自旋锁是三者中最不灵活的,但它也是最好的。它很快,因为不需要转换到操作系统内核模式,并且因为编译器支持用于实现自旋锁的内联机器代码内部操作。它不灵活,因为它不能有效地等待并且通常不支持递归。CriticalSection几乎和自旋锁一样快,并且有效地像MutexSem一样等待。CriticalSection是自旋锁和MutexSem的混合体。如果无法获得锁,它将旋转多次尝试获取锁,然后高效地等待。自旋锁不需要转换到内核态,这就是CriticalSection快速的原因。即使不需要等待,MutexSem也始终转换到内核态。

注意:请记住,“快速”是一个相对术语.MutexSem“慢”,只是因为存在技术上更快的其他可能性。通常,只有负载很重的程序(如服务器应用程序)才需要仔细考虑所使用的同步机制及其消耗的时间。

该文章对三种锁的比较差别讲的很不错。当然,一般处理计算量很大的数据并且用到多线程或者多进程时候,不同的锁的性能差别才会被放大,各自的效率才能被体现出来。这时候就要仔细斟酌,权衡利弊,选取最适合场景的锁。文章讲的偏理论,不同操作系统可能各有一些区别,但是无论用哪种语言,哪种操作系统,大体的意思都大同小异。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值