目录
一丶POSIX信号量
1.什么是信号量
信号量本质是一个计数器~用来描述临界资源的有效个数~POSIX和systeam V信号量都用于同步工作,达到无冲突的访问共享资源。但是POSIX可以用于线程同步~
2.信号量原理
和互斥锁一样的原理,互斥锁每次只保证一个线程可以访问临界区,假如我们把临界资源分成很多小的资源,想让这个线程访问这一块,那个线程访问另外一块。这就可以使用信号量进行控制~信号量执行的也是原子性操作~
P:我们将申请信号量称为P操作,申请信号量的本质就是申请获得临界资源中某块资源的使用权限,当申请成功时临界资源中资源的数目应该减一,因此P操作的本质就是让计数器减一。
V:我们将释放信号量称为V操作,释放信号量的本质就是归还临界资源中某块资源的使用权限,当释放成功时临界资源中资源的数目就应该加一,因此V操作的本质就是让计数器加一。
结合上图和PV操作的理解,我们可以看出,当多个执行流申请信号量时,信号量本质上就是临界资源,对信号量的PV操作表面看似是++和--操作,但是我们知道++和--不是原子性操作,所有我们就要保证PV操作是原子性操作,结合图中右侧的伪代码,可以看出都对PV操作进行的加锁和解锁的操作,这样的目的是为了保证申请和释放信号量时是原子性;
当执行流申请信号量时,可能此时信号量为0,说明信号量描述的临界资源被申请完了,那么这个执行流就要挂起等待,在信号量等待队列中等待,直到有信号量释放被唤醒。
信号量的本质是计数器,但不意味着只有计数器,信号量还包括一个等待队列
二丶信号量使用
1.操作介绍
使用信号量首先就要创建一个sem_t类型的变量
#include <semaphore.h>//头文件 sem_t sem1;
信号量初始化:
int sem_init(sem_t *sem, int pshared, unsigned int value);
参数解读:
- sem:需要初始化的信号量。
- pshared:一般给0,传入0值表示线程间共享,传入非零值表示进程间共享。
- value:信号量的初始值(计数器的初始值)。
返回值说明:
- 初始化信号量成功返回0,失败返回-1。