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

简介: 自旋锁

简介

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

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

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

自旋锁相关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】

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

相关文章
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
537 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
Kubernetes 关系型数据库 MySQL
Helm入门(一篇就够了)
Helm入门(一篇就够了)
483 0
|
测试技术 程序员
W模型和瀑布模型与“V”模式开发模型有何异同?
W模型和瀑布模型与“V”模式开发模型有何异同?
471 1
|
缓存 前端开发 Linux
Linux yum 命令
10月更文挑战第1天
197 2
|
前端开发 API UED
React组件生命周期详解
【9月更文挑战第4天】在React应用开发中,掌握组件生命周期对于管理状态和属性至关重要,并能有效提升应用性能。本文详细介绍了React组件生命周期的三个阶段:挂载、更新和卸载,并通过代码示例展示了如何避免状态更新导致的死循环及优化网络请求等问题,帮助开发者构建更高效、可维护的应用。
270 3
|
安全 网络协议 网络安全
网络安全与信息安全:保护你的数字世界
在数字化时代,网络安全和信息安全问题日益突出。本文将探讨网络安全漏洞、加密技术和安全意识等方面的知识,帮助读者更好地保护自己的数字世界。
109 31
|
网络协议 Java
在Java中使用TCP协议搭建一个简单的客户端
如何在Java中使用TCP协议搭建一个简单的客户端
477 2
|
存储 Kubernetes 容器
【CKA模拟题】综合案例演示如何创建pv和pvc
【CKA模拟题】综合案例演示如何创建pv和pvc
816 1
|
前端开发 JavaScript Java
Java项目实战|基于SSM框架开发实现毕业生就业管理系统
Java项目实战|基于SSM框架开发实现毕业生就业管理系统
165 0
|
负载均衡 前端开发 应用服务中间件
NGINX高可用之keepalived+nginx主从模式+主主模式配置实践
NGINX高可用之keepalived+nginx主从模式+主主模式配置实践
1401 1