信号量
概念
用于实现进程、线程间的同步和互斥关系(主要用来实现同步),本质上是由一个计数器和一个 pcb 等待队列构成。
同步
通过自身的计数器堆资源数目进行计数,并通过计数判断进程、线程是否满足访问临界资源的条件,若满足则进行访问,若不满足则阻塞等待直到被唤醒。
互斥
只需要保证计数器的计数不大于 1 即可保证一个资源在同一时间内只被一个进程、线程所访问。(<= 0 都进等待队列)
函数功能接口
1. 定义信号量
sem_t sem;
2. 初始化信号量
int sem_init(sem_t *sem, int pshared, unsigned int value);
参数:
sem 信号量
pshared 0/线程----非0/进程
val 初始化信号量的初值(起始资源数目)
返回值: 0 成 1 败
3. 判断访问条件是否满足(本身是原子操作,所以不需要配互斥锁使用)
int sem_wait(sem_t *sem) //满足则访问,不满足则等待
sem 信号量
int sem_trywait(sem_t *sem) //满足则访问,不满足则立即返回报错
sem 信号量
4. 唤醒阻塞的进程、线程
int sem_post(sem_t *sem);
sem 信号量
5. 销毁信号量
int sem_destroy(sem_t *sem);
sem 信号量
简单代码演示