之前上学比赛学习freertos的时候接触过信号量的概念,现在毕业两个月发现之前的很多后有些忘了。通过在linux平台再熟悉一下
- 信号量分为计数型信号量、互斥信号量(二值信号量)
信号量与自旋锁的区别
- 信号量会使线程进入休眠状态,而自旋锁不会,自旋锁会一直等待(自旋)
- 信号量不能用于中断,因为信号量会引起休眠,中断中不能休眠。
- 如果是短暂的持有共享资源,用自旋锁比较好。因为频繁的休眠,切换线程会只占用资源
Linux内核使用semaphore结构体表示信号量,结构体内容如下所示
struct semaphore {
raw_spinlock_t lock;
unsigned int count;
struct list_head wait_list;
};
使用信号量的方法:定义一个信号量、初始化信号量。有关信号量的API如下所示
信号量的使用如下所示
struct semaphore sem; //定义信号量
sema_init(&sem,1); //初始化信号量
down(&sem); //获取信号量
/*
临界区
*/
up(&sem); //释放信号量
二、互斥体(二值信号量ÿ