問題規則:
多個讀者可以讀取某個資源;當至少有一名讀者在讀取資源或者此資源被寫時,此資源不能被寫;當資源被寫時,該資源不能被讀取。
問題分析:
其實這個問題並不複雜,首先我們需要一個互斥量mutext_data
對讀寫資源進行加鎖。由於,資源可以被多個讀者讀取,所以需要定義一個變量count
來記錄讀者數量。由於變量count
的操作對於不同的讀者之間是互斥的,所以需要再加個互斥量mutex_count
對count
變量進行加鎖。
代碼
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
操作只進行一次,最後會使得該資源不可寫。