linux进程--自旋锁和互斥锁的区别(十五)
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且不可抢占式的内核下,自旋锁的操作为空操作。自旋锁适用于锁使用者保持锁时间比较短的情况下。
原文链接:https://www.cnblogs.com/guagua2016/p/6068925.html
linux进程--自旋锁和互斥锁的区别(十五)相关推荐
- linux进程--自旋锁和互斥锁的区别(十四)
自旋锁(Spin lock) 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,"自旋&qu ...
- 【Linux kernel】自旋锁和互斥锁
内核当发生访问资源冲突的时候,可以有两种锁的解决方案选择: 一个是原地等待 一个是挂起当前进程,调度其他进程执行(睡眠) Linux内核提供了自旋锁和互斥锁的机制,两者都能保证在同一时刻只有一个执行单 ...
- 【Linux 多线程】自旋锁与互斥锁区别
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API.线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用 Pthreads提供的锁机制(lock)来对多 ...
- Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等...
http://blog.51cto.com/13919357/2339446 Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容 ...
- 自旋锁、互斥锁和信号量
自旋锁 Linux内核中最常见的锁是自旋锁(spin lock).自旋锁最多只能被一个可执行线程持有.如果一个执行线程试图获得一个已经被持有的自旋锁,那么该线程就会一直进行忙循环--旋转--等待锁重新 ...
- Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等
Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互 ...
- 关抢占 自旋锁_互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
前言 生活中用到的锁,用途都比较简单粗暴,上锁基本是为了防止外人进来.电动车被偷等等. 但生活中也不是没有 BUG 的,比如加锁的电动车在「广西 - 窃·格瓦拉」面前,锁就是形同虚设,只要他愿意,他就 ...
- 自旋锁和互斥锁实例_多线程编程之自旋锁
一.什么是自旋锁 一直以为自旋锁也是用于多线程互斥的一种锁,原来不是! 自旋锁是专为防止多处理器并发(实现保护共享资源)而引入的一种锁机制.自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用 ...
- 你了解多线程自旋锁、互斥锁、递归锁等锁吗?
首先看一下问题引出,先看一些经典的问题. 多线程的隐患 首先我们利用多线程的话肯定是好处多多,因为我们可以同时去做一些事情,大大的提高了效率.像我们下载视频的时候就可以同时下载多个视频,这样是节省了很 ...
最新文章
- WCF Security基本概念(转载)
- 避免后台脚本重复启动机制
- 关于枚举,enum、Enum、EnumSet、RegularEnumSet、JumboEnumSet
- JEECG Framework 3.4.1 beta 版本发布
- C/C++——cmd下丢失mspdb100.DLL解决方法
- 罗永浩开了一家直播界的新东方
- 蓝桥杯 ADV-111 算法提高 Quadratic Equation
- 基于Wi-Fi的HID注射器,利用WHID攻击实验
- log4j容器初始化探究
- 字符串通配符(递归)
- java中,HashMap为什么每次扩容的倍数是2,而不是1.5或者2.5?
- 多开夜神模拟器adb连接
- linux+开机启动sshd_Linux sshd服务自动启动
- 解决七彩虹断剑C.A320M-K PRO V14在Win11下前置面板音频接口无法使用的问题
- Windows下 C++ API函数大全
- 从软件工程师到有赞新零售技术负责人,34岁李星专访
- win7桌面计算机图标去掉,win7桌面图标小箭头怎么去掉?
- 如何解决谷歌Chrome浏览器空白页的问题
- 计算机一级考试的时候用计算器,在WPS文字里设置计算器功能
- 云南省最好的计算机学校排名,云南学校排名
热门文章
- python考级证书-python考级有几个级别
- python入门教程2word-使用python操作word
- python读取excel文件-python读取excel文件
- monty python flying circus-巨蟒剧团之飞翔的马戏团 第一季
- python运行软件-提高Python程序的运行速度
- python语言程序设计梁勇-Python语言程序设计(美-梁勇)第1章习题解答
- python类中方法的执行顺序-浅谈Python的方法解析顺序(MRO)
- idea getset的快捷键
- 题目1015:还是A+B
- IGMP Internet组管理协议 未完