采用信号量机制实现消费者与生产者的线程同步_信号量机制

转载:https://blog.csdn.net/weixin_39706561/article/details/111124976

什么是信号量

  • 信号量是一种变量或抽象数据类型,用于控制并发系统中多个进程对公共资源的访问
  • 一个普通的信号量是一个普通的变量,可以对它进行递增或递减,或切换等操作。

引用一波百度百科的解释:

以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。 在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。

信号量的分类

  • 计数信号量:信号量是一个任意的整数
  • 二值信号量:只有二进制的0或1

信号量的工作机制

信号量的值表示用于控制并发系统中多个进程对公共资源的访问,只有P/V操作能够修改信号量的值

  • P(pass)操作:
    • 完成一次wait(),信号量值减一,如果新的信号量值大于0,则进入临界区
    • 如果新的信号量的值小于0,那么该进程将被阻塞(被添加到semaphor的等待进程队列里面waiting queue)
  • V(release)操作
    • 完成一次signal(),信号量值加一,如果递增之前,semaphore的值小于0(表示有进程正在等待获取资源),从waiting queue中挑选一个进程到ready queue里面

实战

例:若有一售票厅只能容纳300人,当少于300人时,可以进入;否则,需在外等候。若将每一个购票者作为一个进程,请用P(wait)、V(signal)操作编程,并写出信号量的初值。(强调:只有一个购票窗口,每次只能为一位购票者服务)

分析:

1)首先确定临界区资源:售票厅,购票窗口

2)初始化信号量:

  • 售票厅的信号量可以用一个计数信号量emptyCount,初始化fullCount= 0(fullCount<= 300)
  • 购票窗口的只有一个,只有两种状态:占用和空闲,用一个二值信号量IsBusy, 初始化isBusy = 1 为空闲
user process {
                P(emptyCount)
                
                进入大厅
                
                P(IsBusy)
​
                窗口购票
​
                V(IsBusy)
                
                退出购票窗口
                
                V(emptyCount)
                
                退出大厅

信号量的特点

  • 适用于控制一个仅支持有限个用户的共享资源
  • 与锁的区别:Lock和synchronized是锁的互斥,一个线程如果锁定了一资源,那么其它线程只能等待资源的释放。也就是一次只有一个线程执行,这到这个线程执行完毕或者unlock;而Semaphore可以控制多个线程同时对某个资源的访问。
  • semaphore锁的是什么:信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作。也就是说Semaphore不一定是锁定某个资源,而是流程上的概念。
    • 比方说生产者消费者模型中,当共享缓冲区中已经满了,那么producer不能继续生产处于阻塞状态(此时缓冲区的信号量为emptyCount = 0),这个时候消费者一旦消费了一个数据之后(emptyCount = 1),那么又可以通知生产者继续生产,此时正处于阻塞状态的producer重新获取到信号量,从waiting queue 进入到ready queue。
    • 此时对于生产者消费者模型来说,这里的信号量并没有锁共享资源,而只是起到了一个通知作用,或者从另一个角度来说,相当于一个触发器,当达到了某一条件时,触发另外一个事件的发生
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值