Appearance
2.17 管程
void producer(){
char x;
while(1)
{
produce(x);
append(x);
}
}
void consumer(){
char x;
while(1)
{
take(x);
consume(x);
}
}
三、管程的主要特点
局部数据变量只能被管程的过程访问,任何外部过程都不能访问。
一个进程通过调用管程的一个过程进入管程。
在任何时候,只能有一个进程在管程中执行,调用管程的任何其他进程都被挂起,以等待管程变成可用的。
二、同步
为进行并发处理,管程必须包含同步工具。
- 假设一个进程调用了管程,它在管程中时,须被挂起,直到满足某些条件时才恢复。这就需要一种机制,使得该进程不仅被挂起,而且能释放这个管程,以便某些别的进程可以进入。之后,当条件满足并且管程再次可用时,需要恢复该进程并允许它在挂起点重新进入管程。
管程通过使用条件变量提供对同步的支持,这些条件变量包含在管程中,并且只有在管程中才能被访问。有两个函数可以操作条件变量:
Cwait(c):调用进程的执行在条件c上挂起,管程现在可被另一个进程使用。
Csignal(c):恢复在cwait之后为某些条件而挂起的进程的执行。如果有多个这样的进程,选择其中一个;如果没有这样的进程,什么也不做。