进程同步问题

文章探讨了并发控制中的经典问题,包括使用记录型和AND型信号量解决生产者-消费者问题,通过管程处理生产者消费者问题,以及应用AND型信号量解决哲学家进餐问题和采用记录型信号量解决读者-写者问题。这些示例展示了不同同步原语在多线程环境中的应用。
摘要由CSDN通过智能技术生成

生产者-消费者问题

记录型信号量
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);
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值