3.信号量
信号量常常用于对控制对共享资源的访问,比如说一个停车场有50个停车位,这个就是一个共享资源,这个50个车位加入现在停了45辆车,这个车的数量就是信号量,当这个信号量的值达到50就是说明停车场满了,这个时候就可以看看有没有车开出去,如果有个车开出去就是信号量-1,这个时候你可以开进去,就是信号量+1.
信号量与自旋锁的区别就是信号量可以使线程进入休眠状态,而不是一直在自旋等待,但是休眠等待会切换携程,所以导致比自旋锁的开销要大。所以信号量适合的场景1.适合占用资源比较久的场景2不能在中断中用信号量,中断不能休眠。
struct semaphore {
raw_spinlock_t lock;
unsigned int count;
struct list_head wait_list;
};
例:
struct semphore sem; //定义信号量
sema_init(&sem, 1); //初始化信号量
down(&sem); //申请信号量
up(&sem); //释放信号量
4,互斥体 mutex
表示一次只能有一个线程访问共享资源,信号量不一定是锁定某一资源,还可以是进行一些计算或者数据处理之类。而线程互斥体则是“锁住某一资源”的概念,在锁定期间内,其他线程无法对被保护的数据进行操作。不难看出,mutex是semaphore的一种特殊情况(n=1时)。
定义结构
struct mutex {
atomic_t count;
spin