管程
为什么要引入管程
管程就像是一个类,将信号量与PV操作进行了封装
管程的组成:
-
局部于管程的共享数据结构说明
-
对该数据结构进行操作的一组过程
-
对局部于管程的共享数据设置初始值的语句
-
管程要有一个名字
管程的基本特征:
-
局部于管程的数据只能被局部于管程的过程所访问(变量私有)。
-
一个进程只有调用过程才能进入管程访问共享数据。
-
每一次仅仅允许一个进程在管程中执行某一个内部过程。(相当于是互斥了叭)(由编译器负责实现各进程互斥地进入管程中的过程)
管程是用来实现进程互斥和同步的
//用管程解决生产者与消费者问题
//定义管程
monitor ProducerConsumer
condition full , empty ; //用来实现同步的信号量
int count = 0;
void insert(Intm item){
if(count == N){
wait(full); // 相当于是P操作,在这里停着等待唤醒
}
count ++;
insert_item(item);
if(count == 1) //如果是第一个插入的
signal(empty);//将等待的消费者唤醒
}
Item remove(){
if(count == 0){
wait(empty);
}
count--;
if(count == N-1)
signal(full);//管程的signal操作与V操作不同,这个必须要在wait操作之后
return remove_item();
}
end monitor;
//生产者
producer(){
while(1){
item = 生产一个产品;
ProducerConsumer.insert(item);
}
}
//消费者
consumer(){
while(1){
item = ProducerConsumer.remove();
消费 item;
}
}

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!