Skip to content

2.17 管程

Giovanna

About 401 wordsAbout 1 min

2024-08-31

image.png

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之后为某些条件而挂起的进程的执行。如果有多个这样的进程,选择其中一个;如果没有这样的进程,什么也不做。