随笔 - 46, 文章 - 0, 评论 - 0, 阅读 - 9606

管程

Posted on   wuqiu  阅读(189)  评论(0编辑  收藏  举报

管程

为什么要引入管程

管程就像是一个类,将信号量与PV操作进行了封装

管程的组成:

  1. 局部于管程的共享数据结构说明

  2. 对该数据结构进行操作的一组过程

  3. 对局部于管程的共享数据设置初始值的语句

  4. 管程要有一个名字

管程的基本特征:

  1. 局部于管程的数据只能被局部于管程的过程所访问(变量私有)。

  2. 一个进程只有调用过程才能进入管程访问共享数据。

  3. 每一次仅仅允许一个进程在管程中执行某一个内部过程。(相当于是互斥了叭)(由编译器负责实现各进程互斥地进入管程中的过程)

管程是用来实现进程互斥和同步的

//用管程解决生产者与消费者问题
//定义管程
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;
    }
}
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示