操作系統讀者與寫者同步問題

問題規則:

多個讀者可以讀取某個資源;當至少有一名讀者在讀取資源或者此資源被寫時,此資源不能被寫;當資源被寫時,該資源不能被讀取。

問題分析:

其實這個問題並不複雜,首先我們需要一個互斥量mutext_data對讀寫資源進行加鎖。由於,資源可以被多個讀者讀取,所以需要定義一個變量count來記錄讀者數量。由於變量count的操作對於不同的讀者之間是互斥的,所以需要再加個互斥量mutex_countcount變量進行加鎖。

代碼

int mutex_data = 1;
int mutex_count = 1;
int count = 0;

//讀者操作
void reader(){
	while(True){
		down(&mutex_count);
		count ++;
		if(count==1) down(&mutex_data);  //只對第一個讀者進行加鎖,防止寫者進入
		up(&mutex_count);
		read();
		down(&mutex_count);
		count--;
		if(count==0) up(&mutex_data);
		up(&mutex_count);
	}
}

//寫者操作
void writer(){
	while(True){
		down(&mutex_data);
		write();
		up(&mutex_data);
	}
}

代碼分析

down()和up()

首先down()up()就是常見的P、V操作(“哲學家問題”同此)。
down():如果信號量大於0,則將信號量-1;如果信號量等於0,則進程進入睡眠,等待信號量大於0.
up():對通信量+1,並喚起相對應的睡眠進程完成之後的down()操作。

代碼解釋

只對第一個讀者進行加鎖是因爲防止多個讀者進行down操作,致使mutex_data等於負數。由於最後的up操作只進行一次,最後會使得該資源不可寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章