Version: Next

管程

信号量 PV 机制的问题:编程困难,容易出错

管程的定义与基本特征

管程是一种特殊的软件模块,由以下部分组成:(就像是个类)

  1. 局部于管程的 共享数据结构 说明
  2. 对该数据结构进行操作的 一组函数
  3. 对局部于管程的共享数据设置初始值的语句
  4. 管程有一个名字

管程的基本特征 (像单例模式)

  1. 局部于管程的数据只能被局部于管程的过程所访问;
  2. 一个进程只有通过调用管程内的过程才能进入管程访问共享数据
  3. 每次仅允许一个进程在管程内执行某个内部过程

拓展1:用管程解决生产者消费者问题

管程伪代码
monitor ProducerConsumer
condition full, empty; // 条件变量用来实现同步
int count = 0; // 缓冲区中的产品数
void insert(Item item) { // 把产品 item 放入缓冲区
if (count == N) wait(full);
count++;
insert_item(item);
if (count == 1) signal(empty);
}
Item remove() { // 从缓冲区取出一个产品
if (count == 0) wait(empty);
count--;
if (count == N - 1) signal(full);
return remove_item();
}
end monitor;
生产者通过管程实现
// 生产者进程
producer() {
while (1) {
item = 生产一个产品;
ProducerConsumer.insert(item); // 管程插入
}
}
消费者利用管程实现
// 消费者进程
consumer() {
while (1) {
item = ProducerConsumer.remove();
消费产品 iteml;
}
}
  • 由编译器负责实现各进程互斥地进入管程的过程

拓展2:Java 中类似管程的机制

就是 synchronized 关键字,在修饰方法时,可以保证在同一时刻方法仅被一个线程调用