虽然信号量提供了一种方便且有效的进程同步机制,但是它们的使用错误可能导致难以检测的时序错误,因为这些错误只有在特定执行顺序时才会出现,而这些顺序并不总是出现。
为了处理这种错误,研究人员开发了一些高级语言工具,一种重要的、高级的同步工具,即管程(monitor)。
抽象数据类型(简称 ADT)封装了数据及对其操作的一组函数,这一类型独立于任何特定的 ADT 实现。管程类型属于 ADT 类型,提供一组由程序员定义的、在管程内互斥的操作。
管程类型也包括一组变量,用于定义这一类型的实例状态,也包括操作这些变量的函数实现。管程类型的语法如下所示:
monitor monitor name
{
/* shared variable declarations */
function P1 (...) {
...
}
function P2 (...){
...
}
.
.
.
function Pn ( . . . ) {
...
}
initialization_code (...){
...
}
}
管程类型的表示不能直接由各种进程所使用。因此,只有管程内定义的函数才能访问管程内的局部声明的变量和形式参数。类似地,管程的局部变量只能为局部函数所访问。
管程结构确保每次只有一个进程在管程内处于活动状态。因此,程序员不需要明确编写同步约束(图 1)。