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

简介: 自旋锁

简介

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

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

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

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

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

相关文章
|
6月前
|
Java 调度
阻塞锁和自旋锁的理解
总体来说,自旋锁适用于锁定时间短、锁竞争不频繁的场景,而阻塞锁更适合锁定时间较长或锁竞争较频繁的场景。根据具体的应用需求选择合适的锁类型,可以优化系统性能。
93 0
|
7月前
|
Linux
Linux多线程中互斥锁、读写锁、自旋锁、条件变量、信号量详解
Linux多线程中互斥锁、读写锁、自旋锁、条件变量、信号量详解
205 0
Linux多线程中互斥锁、读写锁、自旋锁、条件变量、信号量详解
|
7月前
|
调度
互斥锁的初步实现
互斥锁的初步实现
120 0
|
7月前
基于CAS实现自旋锁
基于CAS实现自旋锁
48 0
互斥锁、自旋锁、原子操作
互斥锁、自旋锁、原子操作
自旋锁是啥?
自旋锁是一种基于忙等待的锁机制,它允许线程反复检测锁状态,而不是阻塞等待。当线程尝试获取一个自旋锁时,如果锁已经被其他线程持有,该线程会一直在一个循环中自旋,直到锁被释放。
64 0
|
安全 算法 C++
C++中互斥锁的使用
我们现在有一个需求,我们需要对 g_exceptions 这个 vector 的访问进行同步处理,确保同一时刻只有一个线程能向它插入新的元素。为此我使用了一个 mutex 和一个锁(lock)。mutex 是同步操作的主体,在 C++ 11 的 <mutex> 头文件中,有四种风格的实现: mutex:提供了核心的 lock() unlock() 方法,以及当 mutex 不可用时就会返回的非阻塞方法 try_lock() recursive_mutex:允许同一线程内对同一 mutex 的多重持有 timed_mutex: 与 mutex 类似,但多了 try_lock_for() t
106 0
|
安全 算法 C++
C++11中的互斥锁讲解
C++11中的互斥锁讲解
112 0
|
安全 API
互斥锁的使用
互斥锁的使用
95 0
互斥锁的使用