信号量~~

目录

一丶POSIX信号量

1.什么是信号量

2.信号量原理

二丶信号量使用

1.操作介绍

信号量初始化: 

 信号量销毁:

信号量等待:

信号量发布:

三丶基于环形队列的生产消费者模型

 1.空间资源和数据资源

2.生产者和消费者申请和释放资源

四丶环形队列生产模型实现


一丶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。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值