忙等待:
当一个进程处于临界区的时候,其他进程想进入临界区要循环等待
//吸烟者
semaphore mutex = 1, empty = 1, full = 0
set s = {}
thing r[3] = {1,2,3}
供给者(){
while true {
wait(empty)
wait(mutex)
s = send()
signal(mutex)
signal(full)
}
}
吸烟者(){
while true {
for i=0;i<3;i++{
wait(full)
wait(mutex)
if r[i] ∪ s == {1,2,3} { //集合并
signal(empty)
}
signal(mutex)
}
}
}
奇偶判断
semaphore mutex = 1, empty = 1, full = 0
enum{null, odd,even} B
w1(){
while true {
wait(full)
wait(mutex)
if B == odd {
B = null
signal(empty)
}
signal(mutex)
}
}
w2(){
while true {
wait(full)
wait(mutex)
if B == even {
B = null
signal(empty)
}
signal(mutex)
}
}
R(){
while true {
wait(empty)
wait(mutex)
B = send()
signal(mutex)
signal(full)
}
}
动物园
enum{null,pig,tigger} cell
semaphore empty = 1, mutex = 1, zoo = 0, rest = 0
framer() {
while true {
wait(empty)
wait(mutex)
cell = pig
signal(mutex)
signal(rest)
}
}
hunter(){
while true {
wait(empty)
wait(mutex)
cell = tigger
signal(mutex)
signal(zoo)
}
}
rest(){ //餐厅
while true {
wait(rest)
wait(mutex)
cell = null
signal(mutex)
signal(empty)
}
}
zoo(){
while true {
wait(zoo)
wait(mutex)
cell =null
signal(mutex)
signal(empty)
}
}
和尚打水喝水
semaphore t = 3 //桶的锁
semaphore mj = 1 //水井的锁
semaphore mg = 1 //水缸的锁
semaphore empty = 10 , full = 0
小和尚(){
wait(empty)
wait(t)
wait(mj)
从水井取水
signal(mj)
wait(mg)
向水缸中倒水
signal(mg)
signal(full)
signal(t)
}
老和尚(){
wait(full)
wait(t)
wait(mg)
取水
signal(mg)
signal(empty)
喝水
signal(t)
}
//附加题 - 独木桥
//A, B为两个方向
int countA,countB;
semaphore SA = 1;
semaphore SB = 1;
semaphore mutex = 1;
A(){
while true {
wait(SA)
if countA == 0 {
wait(mutex)
}
countA ++
signal(SA)
//通过独木桥
wait(SA)
countA--
if countA == 0 {
signal(mutex)
}
signal(SA)
}
}
B(){
while true {
wait(SB)
if countB == 0 {
wait(mutex)
}
countB ++
signal(SB)
//通过独木桥
wait(SB)
countB--
if countB == 0 {
signal(mutex)
}
signal(SB)
}
}