POSIX信号量:从基础到多生产者多消费者模型
1. 死锁问题
在消费者函数中,如果错误地交换了两次 Sem-wait 调用的顺序,会导致死锁。假设生产者先开始,它会向缓冲区存储 NBUFF 个项目,将 nempty 信号量的值从 NBUFF 减到0,将 nstored 信号量的值从0增加到 NBUFF 。此时,由于缓冲区已满且没有空槽,生产者在 Sem-wait (shared.nempty) 调用中被阻塞。
消费者开始后,会验证缓冲区中的前 NBUFF 个项目,将 nstored 信号量的值从 NBUFF 减到0,将 nempty 信号量的值从0增加到 NBUFF 。然后,消费者在调用 Sem-wait (shared.mutex) 后,在 Sem-wait (shared.nstored) 调用中被阻塞。此时,生产者可以恢复执行,因为 nempty 的值现在大于0,但生产者随后调用 Sem-wait (shared.mutex) 并被阻塞。
这就产生了死锁,生产者在等待互斥信号量,而消费者持有该信号量并等待 nstored 信号量。但生产者在获得互斥信号量之前无法向
超级会员免费看
订阅专栏 解锁全文
587

被折叠的 条评论
为什么被折叠?



