并发与竞态
处理并发的机制(信号量和自旋锁)
- 信号量
1.定义信号量
#include <asm/semaphore.h>
struct semaphore sem;
2.初始化信号量
void sema_init(struct semaphore *sem, int val)
val 为非正数 表明有任务等待信号量
3.锁
int down_interruptible(struct semaphore *sem)
TASK_INTERUPTIBLE
down_killable(struct semaphore *sem)
TASK_KILLABLE
※ down()已经不建议使用
4. 释放
void up(struct semaphore *sem)
- 互斥锁(特殊的信号量)
1. 初始化互斥锁
void init_MUTEX(struct semaphore *sem) //初始化为1
DECLARE_MUTEX(struct semaphore *sem)//定义并初始化为1
void init_MUTEX_LOCKED(struct semaphore *sem) //初始化为0
DECLARE_MUTEX_LOCKED(struct semaphore *sem)//定义并初始化为0
- 自旋锁
不会引起调用的睡眠,特点为忙等。
spin_lock_init(x)
spin_lock(lock)
spin_trylock(lock)
spin_unlock(lock)
- 信号量与自旋锁区别
1. 信号量可以有多个持有者,自旋锁只能有一个持有者。
2. 自旋锁适用于持有时间较短的(忙等的特点)