【每天一个小知识】自旋锁

简介: 自旋锁

简介

自旋锁与互斥锁类似,但是自旋锁不会引起调用者睡眠。如果自旋锁被其他执行单元保持,则调用者会一直循环等待保持者释放锁

想像这么一个场景,早上醒来你要上厕所(临界区),进入该厕所需要一把钥匙(自旋锁),你发现厕所关着,里面有人了(锁被保持了),你敲门申请,在门外一直等待(循环等待,不会挂起睡眠,而互斥锁会),直到里面的人出来,把钥匙给你(保持着释放锁,你获得锁),进入厕所。

自旋锁的效率远高于互斥锁。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,任何时刻最多只能有一个执行单元获得锁

自旋锁相关API

关于自旋锁的API,在内核include/linux/spinlock.h里面有,具体要用到自旋锁保护临界区时,可以再去查询各个函数的作用。

static inline void spin_lock(spinlock_t *lock)
{
 raw_spin_lock(&lock->rlock);
}
static inline void spin_lock_bh(spinlock_t *lock)
{
 raw_spin_lock_bh(&lock->rlock);
}
static inline int spin_trylock(spinlock_t *lock)
{
 return raw_spin_trylock(&lock->rlock);
}
#define spin_lock_nested(lock, subclass)    \
do {        \
 raw_spin_lock_nested(spinlock_check(lock), subclass);  \
} while (0)
#define spin_lock_bh_nested(lock, subclass)   \
do {        \
 raw_spin_lock_bh_nested(spinlock_check(lock), subclass);\
} while (0)
#define spin_lock_nest_lock(lock, nest_lock)    \
do {          \
 raw_spin_lock_nest_lock(spinlock_check(lock), nest_lock);  \
} while (0)
static inline void spin_lock_irq(spinlock_t *lock)
{
 raw_spin_lock_irq(&lock->rlock);
}
#define spin_lock_irqsave(lock, flags)    \
do {        \
 raw_spin_lock_irqsave(spinlock_check(lock), flags);  \
} while (0)
#define spin_lock_irqsave_nested(lock, flags, subclass)   \
do {          \
 raw_spin_lock_irqsave_nested(spinlock_check(lock), flags, subclass); \
} while (0)
static inline void spin_unlock(spinlock_t *lock)
{
 raw_spin_unlock(&lock->rlock);
}
static inline void spin_unlock_bh(spinlock_t *lock)
{
 raw_spin_unlock_bh(&lock->rlock);
}
static inline void spin_unlock_irq(spinlock_t *lock)
{
 raw_spin_unlock_irq(&lock->rlock);
}
static inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
{
 raw_spin_unlock_irqrestore(&lock->rlock, flags);
}
static inline int spin_trylock_bh(spinlock_t *lock)
{
 return raw_spin_trylock_bh(&lock->rlock);
}
static inline int spin_trylock_irq(spinlock_t *lock)
{
 return raw_spin_trylock_irq(&lock->rlock);
}
#define spin_trylock_irqsave(lock, flags)   \
({        \
 raw_spin_trylock_irqsave(spinlock_check(lock), flags); \
})
static inline void spin_unlock_wait(spinlock_t *lock)
{
 raw_spin_unlock_wait(&lock->rlock);
}
static inline int spin_is_locked(spinlock_t *lock)
{
 return raw_spin_is_locked(&lock->rlock);
}
static inline int spin_is_contended(spinlock_t *lock)
{
 return raw_spin_is_contended(&lock->rlock);
}
static inline int spin_can_lock(spinlock_t *lock)
{
 return raw_spin_can_lock(&lock->rlock);
}

号主:一枚机械专业本科生,经历了转行,从外包逆袭到芯片原厂的Linux驱动开发工程师,深入操作系统的世界,贯彻终身学习、终身成长的理念。平时喜欢折腾,寒冬之下,抱团取暖,期待你来一起探讨技术、搞自媒体副业,程序员接单和投资理财。【对了,不定期送闲置开发板、书籍、键盘等等】。

如果你想了解我的转行经验,欢迎找我交流~gongzhong号【哆哆jarvis】

一起不断探索自我、走出迷茫、找到热爱,希望和你成为朋友,一起成长~

相关文章
|
7月前
|
监控 数据可视化 BI
2025年11月国内外10款主流BI工具大全,好用的BI产品推荐
数字化转型加速,企业对数据挖掘需求迫切,商业智能(BI)工具成关键支撑。本文解析了国内外10款知名BI工具:国内产品适配本土需求,如瓴羊Quick BI具备多源数据接入能力,服务超万家企业;永洪BI自研引擎支撑复杂数据处理;Wyn商业智能是工业场景深度集成专家;百度智能BI是AI驱动的云原生分析工具。国际产品技术成熟,如Tableau可视化能力强;Microsoft Power BI与微软生态无缝集成;Qlik Sense关联式数据引擎突出;Looker是云原生企业级分析平台;MicroStrategy擅长企业级复杂数据处理。企业选型时,选择契合自身需求的工具,以发挥数据驱动决策的价值。
|
SQL 安全 Java
SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面.相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足更多安全控制方面的需求,但也相对它的学习成本会更高,两种框架各有利弊.实际开发中还是要根据业务和项目的需求来决定使用哪一种.
SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
|
SQL Java 数据库连接
1天搞定SpringBoot+Vue全栈开发 (3)MybatisPlus(数据库操作)
1天搞定SpringBoot+Vue全栈开发 (3)MybatisPlus(数据库操作)
|
XML 机器学习/深度学习 监控
性能监控之Telegraf+InfluxDB+Grafana NVIDIA GPU实时监控
【6月更文挑战12天】性能监控之Telegraf+InfluxDB+Grafana NVIDIA GPU实时监控
1075 0
|
存储 Python Windows
轻松学会openpyxl库,Python处理Excel有如神助
轻松学会openpyxl库,Python处理Excel有如神助
981 0
|
Ubuntu
嵌入式实践教程--jetson nano安装ROS(国内源)
嵌入式实践教程--jetson nano安装ROS(国内源)
|
网络安全 芯片 内存技术
可编程 USB 转串口适配器开发板 UART 转 SPI 应用
GD25Qxx 是四线SPI 接口的 FLASH 芯片,最大容量可达 16Mbytes。板上集成有 GD25Q64 芯片, 每页 256 字节,每扇区 16 页(4k 字节),每块区 256 页(64k),写入前必须先擦除,本芯片支持扇区擦除、块区擦除和整片擦除。
可编程 USB 转串口适配器开发板 UART 转 SPI 应用
|
传感器 供应链 区块链
柔宇科技IPO真相
2020年的最后一天,柔宇科技向上交所递交科创板IPO申请获受理,柔宇科技背后的41名创投和自然人股东等来了决战的一刻。
|
网络协议 网络架构 数据安全/隐私保护
Java---网络编程(1)
网络编程 相关基础概念 1、计算机网络与Internet 2、TCP/IP协议 3、Internet地址 - - -IP地址,形如xxx.xxx.xxx.xxx - - -域名系统。
1057 0