如何使用訊號量實現監視器?


若要使用訊號量實現監視器,需為每臺監視器提供一個訊號量 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--;
}

更新日期:2019-10-11

2,000+ 瀏覽

開啟您 事業

參加培訓班獲得認證

開始學習
廣告
© . All rights reserved.