生产者消费者问题、读者写者问题,理发师问题

定义:

生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

信号量解决方法:

	item B[k];//K个缓冲区
	semaphore empty=k,full=0,metux=1;//空的和满的缓冲区的个数,以及互斥信号量
	int in=0,out=0;//指针
	cobegin
		process producer_i(){//生产者进程
			while(1){
				produec();//生产产品
				P(empty);//对空信号量进行操作
				P(mutex);
				append to B[in];
				in=(in+1)%k;//向缓冲区中放置一个
				V(mutex);
				V(full);//对满信号量操作
			}
		}
	coend
	cobegin
		process consumer_i(){//消费者进程
			while(1){
				P(full);//对满信号量操作
				P(mutex);
				take from B[out];
				out=(out+1)%k;//从缓冲区中取走一个
				V(mutex);
				V(empty);//对空信号量操作
				consume();
			}
		}
读者写者问题

“读者—写者”问题—记录型信号量
一个数据文件或记录可被多个进程共享。

只要求读文件的进程称为“Reader进程”,其它进程则称为“Writer进程”。
允许多个进程同时读一个共享对象,但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象
“读者—写者问题”是保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题。

对于一个文件,同一时间允许多个读者读,只允许一个写者写。

int count=0;//在读的个数
semaphore mutex=1,writeblock=1;//二元信号量,和读者锁
cobegin
	process reader_i(){
		P(mutex);
		count++;
		if(count==1) P(writeblock);
		V(mutex);
		{读文件}
		P(mutex);
		count--;
		if(count==0)V(writeblock);
		V(mutex);
	}
cend

cobegin
	process writer_i(){
		P(writeblock);
		{写操作}
		V(writeblock);
	}
coend

理发师睡眠问题:

1、没有顾客,理发师睡觉
2、某位顾客到来,顾客必须叫醒理发师
3、如果顾客到来后,理发师在理发,如果有空椅子,等待,没有的话,离开。

int waiting=0,chair=n;//等待的顾客数
semaphore customers=0,babres=0,mutex=1;
cobegin
	proecss baber(){
		while(1){
			P(customers);
			P(mutex);
			waiting--;
			V(babres);//理发师喊来顾客理发
			V(mutex);
		}
	}
coend
cobegin 
	process customer(){
		P(mutex);
		if(waiting<chairs){
			waiting++;
			V(customers);
			V(mutex);
			P(barbres);
			get_haircut();
		}else V(mutex);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值