自旋锁和互斥锁的区别

自旋锁和互斥锁的区别

POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API。线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用

Pthreads提供的锁机制(lock)来对多个线程之间的共享临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。

Pthreads提供了多种锁机制:

  • Mutex(互斥量):pthread_mutex_t
  • Spin lock(自旋锁): pthread_spin_t
  • Condition Variable(条件变量): pthread_cond_t
  • Read/Write lock(读写锁):pthread_rwlock_t

Pthreads提供的Mutex锁操作相关的API主要有:

  • pthread_mutex_lock(pthread_mutex_t *mutex);
  • pthread_mutex_trylock(pthread_mutex_t *mutex);
  • pthread_mutex_unlock(pthread_mutex_t *mutex);

Pthreads提供的Spin Lock锁操作相关的API主要有:

  • pthread_spin_lock(pthread_spinlock_t *lock);
  • pthread_spin_trylock(pthread_spinlock_t *lock);
  • pthread_spin_unlock(pthread_spinlock_t *lock);

从实现原理上来讲,Mutex(互斥锁)属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和Core1上。假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持有,那么线程A就会被阻塞,

Core0会在此时进行上下文切换(Context Switch)将线程A置于等待队列中,此时Core0就可以运行其它的任务而不必进行忙等待。而Spin lock(自旋锁)则不然,它属于busy-waiting类型的锁,如果线程A是使用pthread_spin_lock操作去请求锁,那么线程A就会一直在Core0上进行忙等待并不停的进行锁请求,直到得到这个锁为止。

自旋锁(Spin lock)

自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,“自旋锁”的作用是为了解决某项资源的互斥使用。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远高于互斥锁。

自旋锁的不足之处:

自旋锁一直占用着CPU,他在未获得锁的情况下,一直运行(自旋),所以占用着CPU,如果不能在很短的时间内获得锁,这无疑会使CPU效率降低。

在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁,调用有些其他函数也可能造成死锁,如 copy_to_user()、copy_from_user()、kmalloc()等。

因此我们要慎重使用自旋锁,自旋锁只有在内核可抢占式或SMP的情况下才真正需要,在单CPU且不可抢占式的内核下,自旋锁的操作为空操作。自旋锁适用于锁使用者保持锁时间比较短的情况下。

 

 

自旋锁-原理

 

跟互斥锁一样,一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。由此我们可以看出,自旋锁是一种比较低级的保护数据结构或代码片段的原始方式,这种锁可能存在两个问题:

1、死锁。试图递归地获得自旋锁必然会引起死锁:递归程序的持有实例在第二个实例循环,以试图获得相同自旋锁时,不会释放此自旋锁。

在递归程序中使用自旋锁应遵守下列策略:

递归程序决不能在持有自旋锁时调用它自己,也决不能在递归调用时试图获得相同的自旋锁。此外如果一个进程已经将资源锁定,那么,即使其它申请这个资源的进程不停地疯狂"自旋",也无法获得资源,从而进入死循环。

2、过多占用cpu资源。如果不加限制,由于申请者一直在循环等待,因此自旋锁在锁定的时候,如果不成功,不会睡眠,会持续的尝试,单cpu的时候自旋锁会让其它process动不了. 因此,一般自旋锁实现会有一个参数限定最多持续尝试次数. 超出后, 自旋锁放弃当前time slice. 等下一次机会

由此可见,自旋锁比较适用于锁使用者保持锁时间比较短的情况。正是由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用,而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作,

 

总结:

互斥锁与自旋锁的区别

(1)、互斥锁mutex:独占锁;开销大

pthread_mutex_lock(pthread_mutex_t *mutex);

pthread_mutex_unlock(pthread_mutex_t *mutex);

(2)、自旋锁spin lock:轻量级的锁,开销小;适用于短时间内对锁的使用

如果自旋锁已经被其他的执行单元保持,调用者就一直循环在那里判断该自旋锁是否被释放

pthread_spin_lock(pthread_spinlock_t *lock);

pthread_spin_unlock(pthread_spinlock_t *lock);

 

注意:对于spin lock,如果递归调用过深,会导致死锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

校内模拟赛 Zbq's Music Challenge

Zbqs Music Challenge 题意: 一个长度为n的序列,每个位置可能是1或者0,1的概率是$p_i$。对于一个序列$S$,它的得分是 $$BasicScoreA\times \sum_{i1}^{n}{S_i} \tag{1}$$ $$ combo(i)\left\{ \begin{aligned} &S_i & &…

TSQL中实现ORACLE的多列IN 多列匹配。

期望效果:(我是拿到一对关系去另一表中的一对关系去对比)select * From Empoylee Where (Address1,Address2) in (Select Address1,Address2 From EmpoyleeAdresses Where Country Canada)以上无法实现用这种方案也可以实现 不过速度很慢的s…

ClickedOnce部署方法

1.ClickedOnce部署时有些DLL和配置文件无法自动部署到系统当中,只能用Manifest Manager Tool 修改manifest 文件 /Files/Tonyyang/Software/ManifestManagerUtility.rar 2.部署文件结构 3.部署方法 首先用VS自带的ClickedOnce发布应用程序(博客园有&…

自旋锁/互斥锁/读写锁/递归锁的区别与联系

自旋锁 互斥锁 读写锁 递归锁 互斥锁(mutexlock): 最常使用于线程同步的锁;标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁;临界区和互斥量都可用来实现此锁,通常情况下…

树莓派安装MySQL数据库与卸载

出处: 1、http://www.cnblogs.com/liyangLife/p/4500115.html 2、https://blog.csdn.net/huayucong/article/details/49736427 3、https://www.imooc.com/article/23132?block_idtuijian_wz 4、http://www.runoob.com/mysql/mysql-install.html(Debian系…

关于selectNodes与selectSingleNode的用法的区别

今天在网上看到一个关于selectNodes与selectSingleNode的用法的区别。 由于之前没有特别在意,因而今日看见是很是惊异。特复制过来,供大家一起学习! 其中文中提到了最重要的区别是在运用操作后的变化。 selectnodes: selectNodes和ChildNo…

第七章 数组

7.1、数组概述 7.1.1、为什么需要数组 答:有时候需要存储或处理一系列数据,数组就可以充当这样的角色,它在内存中是相连的数据,并且在栈中的引用只有一个, 如果不用数组,那数据就得一个一个定义一个一个声明…

notify_one() 或 notify_all() 在c++中的使用要点

notify_one() 或 notify_all() 如果在锁(mutex spin_lock)里调用,可能会导致被立刻唤醒的线程继续阻塞,因为锁被notify线程持有。 c标准上说,一些实现(尤其是许多 pthread 的实现)为了归避这种情况,在通知调用中,直接将…

[转载]Asp.net MVC中Controller返回值类型

Asp.net MVC中Controller返回值类型在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求: 必须是一个public方法必须是实例方法没有标志NonActionAttribute特性的(NoAction)不能被重载必须返回ActionResult类型如: [cs…

Visual Studio.net 2010 Windows Service 开发,安装与调试

本示例完成一个每隔一分钟向C:\log.txt文件写入一条记录为例,讲述一个Windows Service 程序的开发,安装与调试 原程序,加文档示例下载 /Files/zycblog/SourceCode.rar 目录索引 1 开发工具 2 开发过程 3 安装 4 开发调试 5 注意事项 6 参考资料…

ArcGis dbf读写——挂接Excel到属性表 C#

ArcMap提供了挂接Excel表格信息到属性表的功能,但是当数据量较大到以万计甚至十万计的时候这个功能就歇菜了,当然,你可以考虑分段挂接。这个挂接功能只是做了一个表关联,属性记录每个字段的信息需要通过“字段计算器”计算过来。 …

JQuery. Parse XML children recursively. How? - Stack Overflow

JQuery. Parse XML children recursively. How? - Stack OverflowJQuery. Parse XML children recursively. How?

presto领读 查询引擎翻译

原文链接:https://prestodb.io/docs/current/overview/concepts.html#data-sources 最近在看presto-分布式SQL查询引擎的代码,使用翻译工具翻译了一版,有些概念比较难以理解,整理如下: 一、概览 虽然很容易理解语句和…

VisualStudioAddIn2017.vsix的下载安装和使用

本加载项是用于Visual Studio的,下载以后按照如下步骤进行安装: 完全退出Visual Studio把下载了的文件解压缩,会产生一个VisualStudioAddIn2017.vsix文件双击该文件,按照提示安装重启Visual Studio安装完成后的使用方法&#xff0…

Presto基本概念

Presto基本概念 Presto是Facebook开源的MPP SQL引擎,旨在填补Hive在速度和灵活性(对接多种数据源)上的不足。相似的SQL on Hadoop竞品还有Impala和Spark SQL等。这里我们介绍下Presto的基本概念,为后续的笔记做基础。 Operator …

2019春第六周编程总结

这个作业属于哪个课程C语言程序设计Ⅱ这个作业要求在哪里https://edu.cnblogs.com/campus/zswxy/MS/homework/2829我在这个课程的目标是利用指针知识解决相关实际问题在具体哪方面帮我实现目标设计密码开锁、交换变量解决问题以及电码加密参考文献C语言基础、http://www.w3scho…

昨天7月21号,笑笑又生病了

21号从上午就开始发烧,中午吃了安瑞克烧退了,但是下午6点左右又开始发烧了,再次吃安瑞克,效果不是太好,还是烧,睡了觉之后烧退了。晚上十点又开始发烧,吃美林悬浮液烧还是没退,又吃安瑞克,还是烧,到了一点钟,烧,但稍微好一点 22号…

Exchange企业实战技巧(26)在Outlook中打开多个邮箱

工作中,有时要需要让某个用户在outlook中同时打开多个exchange邮箱,对于outlook2010来说,是支持多个Exchange邮箱用户账户的并存,而outlook2007则不支持。那该功能有没其他实现方法呢?答案是有的。 如果你的Exchange是…

sql 为什么要用where 1=1或者where 1 =0 ?

一、不用where 11 在多条件查询中的困扰   举个例子,如果您做查询页面,并且,可查询的选项有多个,同时,还让用户自行选择并输入查询关键词,那么,按平时的查询语句的动态构造,代码…

Java元数据总结:Java注释的使用和定义

元数据从metadata一词译来,就是“关于数据的数据”的意思。越来越的开源框架都提供了“元数据”支持了,其实也就是注释支持。今天系统学习一下Java注释(Java元数据)。本文内容不限于Javadoc的注释。  1.什么是Java元数据,有什么作用?  元…