区分:
信号:通讯机制
信号量:并发控制
一、信号量:基于阻塞的并发控制机制
a.定义信号量 struct semaphore sem;
b.初始化信号量 void sema_init(struct semaphore *sem, int val);
c.获得信号量P操作 int down(struct semaphore *sem);//深度睡眠
解释:down - 获取信号量; @sem: 要获取的信号量;
down()用于获取一个信号量。如果不允许其他 线程/任务 获取这个信号量,那么调用这个函数将使该进程进入睡眠状态,直到释放信号量。同时,该函数的调用不允许中断。
int down_interruptible(struct semaphore *sem);//浅度睡眠
d.释放信号量V操作 void up(struct semaphore *sem);
出错时;阻塞时
#include <linux/semaphore.h>
适用场合:任务上下文之间且临界区执行时间较长时的互斥或同步问题
互斥问题: int val 赋值为大于0
同步问题:int val 赋值为0
二、互斥锁:基于阻塞的互斥机制
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>
适用场合:任务上下文之间且临界区执行时间较长时的互斥问题
三、选择并发控制机制的原则
-
不允许睡眠的上下文(异常上下文)需要采用忙等待类,可以睡眠的上下文可以采用阻塞类。在异常上下文中访问的竞争资源一定采用忙等待类。
-
临界区操作较长的应用建议采用阻塞类,临界区很短的操作建议采用忙等待类。
-
中断屏蔽仅在有与中断上下文共享资源时使用。
-
共享资源仅是一个简单整型量时用原子变量