一、信号量:基于阻塞的并发控制机制
a.定义信号量 struct semaphore sem;
b.初始化信号量 void sema_init(struct semaphore *sem, int val);
c.获得信号量P int down(struct semaphore *sem);//深度睡眠
int down_interruptible(struct semaphore *sem);//浅度睡眠
d.释放信号量V void up(struct semaphore *sem);
#include <linux/semaphore.h>
适用场合:任务上下文之间且临界区执行时间较长时的互斥或同步问题
二、互斥锁:基于阻塞的互斥机制
a.初始化 struct mutex my_mutex; mutex_init(&my_mutex);
b.获取互斥体 void mutex_lock(struct mutex *lock);
c.释放互斥体 void mutex_unlock(struct mutex *lock);
定义对应类型的变量
初始化对应变量
P/加锁 临界区 V/解锁
#include <linux/mutex.h>
适用场合:任务上下文之间且临界区执行时间较长时的互斥问题
三、选择并发控制机制的原则
不允许睡眠的上下文需要采用忙等待类,可以睡眠的上下文可以采用阻塞类。在异常上下文中访问的竞争资源一定采用忙等待类。
临界区操作较长的应用建议采用阻塞类,临界区很短的操作建议采用忙等待类。
中断屏蔽仅在有与中断上下文共享资源时使用。
共享资源仅是一个简单整型量时用原子变量