关于信号量和互斥量协调操作的说明,以防死锁

生产者模型:

在这里插入图片描述

消费者模型:

在这里插入图片描述
必须先操作信号量来查看缓冲区是否可以被操作,之后才能获取缓冲区的使用权(加锁),
如果上面检测信号量和加锁反过来,那么将导致死锁。

例如生产者生产完消息直接对缓冲区加锁,声明主权缓冲区只能由自己使用,然后再查看有没有空间能放消息了,如果这时候消息队列满了,那么生产者将等消费者消费一个消息才能放入,但是消费者将检测到互斥量mutex被加锁了,也就是缓冲区被别人使用了,必须等别人解锁。最终的结果就是你等我,我等你。
将出现生产者等消费者消费,消费者等生产者解锁,双方都不能往前继续执行了,形成死锁。
通俗点说,过马路时,如果没有交通规则,则会出现,你等对方先走,对方也等你先走,最后两人僵死在那儿,直到一方说你先走才解除僵局,但是这是人类的变通方案,计算机很死的,只会出现大家一起耗着,谁都别想走的局面,所以小心使用信号量和互斥量。

另外,信号量可以跨线程使用,信号量可以由一个线程加1,另一个线程减1,都是原子操作,不可分割,不必担心加1减1时被切换到其他任务。
而互斥量只能出现在一个线程中,在一个线程中加锁,在该线程下面解锁,成对出现。
违反规则的操作,其结果未定义。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值