在信号量(生产者和消费者模型)中,我们了解了信号量用于同步,互斥的用法,然而,在生产者和消费者模型中,为了实现同步,我们需要将PV操作放在不同进程(线程)中去实现,这大大增加了我们编程的难度以及出错的概率,因此能否将PV操作集中在一个模块中实现?当然有!这就是我们接下来需要讲的管程。
mooc课对于管程的介绍如下:
通俗一点讲,管程就是将共享变量和对它们的操作集中在一个模块中,这就像我们在写C++类时,将成员变量,成员函数都放在一个类里面一样,这里的模块可以理解为类,这样子一说到管程的好处,我们就可以类比为类理解了:
- 模块化。管程是一个基本程序单位,可以单独编译,模块之间联系清晰,便于维护和修改,易于保证正确性;
- 抽象数据类型。管程是中不仅有数据,而且有对数据的操作;
- 信息封装。管程外可以调用管程内部定义的一些函数,但函数的具体实现外部不可见;
管程组成:
一个锁、0个或多个条件变量Condition Variable(是管程内的等待机制,每个条件变量表示一种等待原因,对应一个等待队列)。
我们以生产者和消费者模型来理解管程: