这篇挺详细 linux 互斥机制_白冬雷的博客-CSDN博客_linux 互斥
自旋锁和信号量的差别好像经常在面试题被问到
linux 自旋锁和信号量_xu_guo的专栏-CSDN博客_信号量和自旋锁
linux内核信号量和互斥锁使用_仗劍走天涯-CSDN博客_linux信号量和互斥锁
原子操作:
原子操作很简单,记住几个函数就行
1)atomic_t v = ATOMIC_INIT(0); //定义原子变量v并初始化为0 2)atomic_read(atomic_t *v); //返回原子变量的值 3)void atomic_inc(atomic_t *v); //原子变量增加1 4)void atomic_dec(atomic_t *v); //原子变量减少1 5)int atomic_dec_and_test(atomic_t *v); //自减操作后测试其是否为0,为0则返回true,否则返回false
第一步:定义一个原子变量,并给原子变量赋值,一般赋予1
第二步:在需要的地方进行判断原子变量是否为零即可,使用原子操作的加减函数对变量进行加减
互斥信号量
信号量(semaphore)是用于保护临界区的一种常用方法,只有得到信号量的进程才能执行临界区代码。当获取不到信号量时,进程进入休眠等待状态。
定义信号量
struct semaphore sem;
初始化信号量
void sema_init (struct semaphore *sem, int val);
void init_MUTEX(struct semaphore *sem);//初始化为0
static DECLARE_MUTEX(button_lock); //定义互斥锁
获得信号量
void down(struct semaphore * sem);
int down_interruptible(struct semaphore * sem);
int down_trylock(struct semaphore * sem);
释放信号量
void up(struct semaphore * sem);
自旋锁
没用过自旋锁,贴个不错的贴子算了
Linux内核中的几种自旋锁的实现_Hober-CSDN博客_自旋锁实现