如何使用訊號量實現監視器?
若要使用訊號量實現監視器,需為每臺監視器提供一個訊號量 mutex(初始化為 1)。流程進入監視器前必須執行 Wait(mutex),離開監視器後必須執行 signal(mutex)。由於發出訊號的流程必須等到恢復的流程離開或等待,所以引入了另外一個訊號量 next,並初始化為 0。發出訊號的流程可用 next 暫停自身。還提供了整型變數 next_count 來統計在 next 上暫停的流程數量。因此,每個外部函式 F 都被替換為-
wait(mutex); … body of F ... if (next_count > 0) signal(next); else signal(mutex);
可確保監視器內的互斥。我們現在來看看條件變數如何實現的。對於每個條件 x,我們引入了訊號量 x _sem 和整型變數 x_count,兩者都初始化為 0。操作 x.wait() 現在可實現為 −
x_count++;
if (next_count > 0){
signal(next);
}
else {
signal(mutex);
}
wait(x_sem);
x_count--;操作 x.signal() 可實現為 −
if (x _count > 0){
next_count++;
signal(x_sem);
wait(next);
next_count--;
}
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
安卓
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP