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

生产者模型:

关于信号量和互斥量协调操作的说明,以防死锁_第1张图片

消费者模型:

关于信号量和互斥量协调操作的说明,以防死锁_第2张图片
必须先操作信号量来查看缓冲区是否可以被操作,之后才能获取缓冲区的使用权(加锁),
如果上面检测信号量和加锁反过来,那么将导致死锁。

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

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

你可能感兴趣的:(linux内核学习,C/C++)