生產者消費者問題、讀者寫者問題,理髮師問題

定義:

生產者消費者問題(英語: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);
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章