雖然號誌提供了一種方便且有效的進程同步機制,但是它們的使用錯誤可能導致難以檢測的時序錯誤,因為這些錯誤只有在特定執行順序時才會出現,而這些順序並不總是出現。
為了處理這種錯誤,研究人員開發了一些高階語言工具,一種重要的、高階的同步工具,即
管程(monitor)。
管程的使用方法
抽象資料型別(簡稱 ADT)封裝了資料及對其操作的一組函數,這一型別獨立於任何特定的 ADT 實現。管程型別屬於 ADT 型別,提供一組由程式設計師定義的、在管程內互斥的操作。
管程型別也包括一組變數,用於定義這一型別的範例狀態,也包括操作這些變數的函數實現。管程型別的語法如下所示:
monitor monitor name
{
/* shared variable declarations */
function P1 (...) {
...
}
function P2 (...){
...
}
.
.
.
function Pn ( . . . ) {
...
}
initialization_code (...){
...
}
}
管程型別的表示不能直接由各種進程所使用。因此,只有管程內定義的函數才能存取管程內的區域性宣告的變數和形式引數。類似地,管程的區域性變數只能為區域性函數所存取。
管程結構確保每次只有一個進程在管程內處於活動狀態。因此,程式設計師不需要明確編寫同步約束(圖 1)。
圖 1 管程的示意圖