操作系统第三次作业-信号量-多线程

忙等待:
当一个进程处于临界区的时候,其他进程想进入临界区要循环等待

//吸烟者
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)
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值