生产者-消费者问题
记录型信号量
semaphore mutex=1,empty=n,full=0;
producer(){ //生产者
while(1){
swait(empty);//记录型 Sswait(empty,mutex);//AND型信号量
swait(mutex);
生产;
signal(mutex);//记录型 Ssignal(mutex,full)//AND型信号量
signal(full);
}
}
customer(){
while(1){
swait(full);
swait(mutex);
消费;
signal(mutex);
signal(empty);
}
}
利用管程实现生产者消费者问题
monitor ProducerCustomer
condition full,empty;
int count=0;
insert(Item item){
if(count==0){
wait(full);
}
count++;
insert_item(item);
if(count==1){
signal(empty);
}
}
remove(){
if(count==0){
wait(empty);
}
count--;
if(count==N-1){
signal(full);
}
return remove_item;
}
producer(){
while(1){
item=生产者;
ProducerCustomer.insert(item);
}
}
customer(){
while(1){
item=ProducerCustomer.remove();
消费产品item;
}
}
哲学家进餐问题
AND型信号量
semaphore chopstick[5]={1,1,1,1,1}
Pi(){
while(1){
think...
Sswait(chopstick[(i+1)%5],chopstick[i]);
eat...
Ssignal(chopstick[(i+1)%5],chopstick[i]);
}
}
读者-写者问题
记录型信号量
semaphore rw=1,mutex=1,w=1;
int count=0;
writer(){
while(1){
P(w);
P(rw);
写文件;
V(rw);
V(W);
}
}
reader(){
while(1){
P(w);
P(mutex);
if(count==0){
P(rw);
}
count++;
V(mutex);
V(w);
读文件;
P(mutex);
count--;
if(count==0){
V(rw);
}
V(mutex);
}
}