背景
之前的pv操作,过于繁琐,pv的顺序一不留神就容易就会发生死锁。
因此“管程”这一种高级同步机制诞生了。
定义和基本特征
管程中的共享数据结构,只能由管程中的函数来调用
每次只允许一个进程在管程中执行某个函数
类似于Java当中的synchronized关键字
实现方式
伪代码 实现 管程
monitor ProdeucerConsumer
condition full,empty; // 条件变量 用来实现同步
int count = 0; // 缓冲区的产品数量
void insert(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); // 满了之后,又消费了一个产品,所有换新 insert进程
return remove_item();
}
end monitor;
生产者进程
producer(){
while(1){
item = 生产产品;
ProdecerConsumer.insert(item);
}
}
消费者进程
consumer(){
while(1){
item = ProdecerConsumer.remove();
消费产品item;
}
}