可以用以下的思考步骤来完成这类问题:
在该类问题中死锁的情况基本只有请求和保持
解决方法:1. PV连续出现,不可能死锁;2.多个P死锁,则尝试调整P操作的顺序
例一

p1() {} // 生产A
p2() {} // 生产B
cs() {} // 装配A+B
p1() {
while(1){
生产A
送到F
}
} // 生产A
p2() {
while(1){
生产B
送到F2
}
} // 生产B
cs() {
while(1){
从F1取一个A
从F2取一个B
组装A+B
}
} // 装配A+B
p1() {
while(1){
生产A
P(F1)
送到F1
}
} // 生产A
p2() {
while(1){
生产B
P(F1)
送到F2
}
} // 生产B
cs() {
while(1){
P(full1)
从F1取一个A
P(full2)
从F2取一个B
组装A+B
}
} // 装配A+B
这里就有很大的问题,还是那个道理,有P必V,建议就是做出一个P,先找在何处V,再去进行下一个PV的操作,这样就不容易出现缺漏
p1() {
while(1){
生产A
P(F1)
送到F1
V(full1) // 在cs中P(full1),当放入一个时,则需要V(full1)
}
} // 生产A
p2() {
while(1){
生产B
P(F1)
送到F2
V(full1) // 在cs中P(full2),当放入一个时,则需要V(full)
}
} // 生产B
cs() {
while(1){
P(full1)
从F1取一个A
V(F1) // 在P1中P(F1),当取出一个时,则需要V(F1)
P(full2)
从F2取一个B
V(F1) // 在P2中P(F2),当取出一个时,则需要V(F2)
组装A+B
}
} // 装配A+B
semaphore F1 = 10 // 表示F1货架的剩余容量
semaphore F2 = 10 // 表示F2货架的剩余容量
semaphore full1 = 0 // 表示F1货架上A产品
semaphore full1 = 0 // 表示F2货架上B产品
p1() {
while(1){
生产A
P(F1)
P(metux1)
送到F1
V(metux1)
V(full1)
}
} // 生产A
p2() {
while(1){
生产B
P(F1)
P(metux2)
送到F2
V(metux2)
V(full1)
}
} // 生产B
cs() {
while(1){
P(full1)
P(metux1)
从F1取一个A
V(metux1)
V(F1)
P(full2)
P(metux2)
从F2取一个B
V(metux2)
V(F1)
组装A+B
}
} // 装配A+B
最后的答案(多加了一个判断货架是否有产品)


小试牛刀

解答:
producer() { // 注释中的序号并不表示执行顺序,只表示一组PV操作的对应
while(1) {
p(tong) // 1
p(jing) // 2(同一时间只有一个桶能取水)
桶取水
v(jing) // 2
p(empty) // 3(缸的容量有限)
p(gang) // 4(同一时间只有一个桶能倒水入缸)
桶入缸
v(gang) // 4
v(full) // 6(入缸后增加了缸里的水)
v(tong) // 1
}
}
consumer() {
while(10 {
p(tong) // 5
p(full) // 6(表示缸里还有多少水)
p(gang) //7
入缸取一桶水
v(gang) //7
v(empty) // 3
喝水
v(tong) // 5
}
}
上述解答会产生死锁:若桶都被consumer拿走,但是缸中无水,此时producer也无法打水,程序死锁
producer() { // 注释中的序号并不表示执行顺序,只表示一组PV操作的对应
while(1) {
p(empty) // 3(缸的容量有限,有空位才提桶)
p(tong) // 1
p(jing) // 2(同一时间只有一个桶能取水)
桶取水
v(jing) // 2
p(gang) // 4(同一时间只有一个桶能倒水入缸)
桶入缸
v(gang) // 4
v(full) // 6(入缸后增加了缸里的水)
v(tong) // 1
}
}
consumer() {
while(10 {
p(full) // 6(表示缸里还有多少水,有水才提桶)
p(tong) // 5
p(gang) //7
入缸取一桶水
v(gang) //7
v(empty) // 3
喝水
v(tong) // 5
}
}

