操作系统PV原语练习(2)

题目描述:
有一个仓库,可以存放A 和B 两种产品,但要求:
(1)每次只能存入一种产品(A 或B);
(2)-N<A 产品数量-B 产品数量<M。其中,N 和M 是正整数。
试用同步算法描述产品A 与产品B 的入库过程。
思路如下:
题目中没有说仓库的大小,假设默认是无限量
每次能存放一个产品,互斥的访问仓库,设置一个仓库的互斥信号量
题目中限制(2)主要可以解毒为,相邻的连续放A的次数,连续放B的次数,两者之差要符合要求
分别设置两个信号量即可,初值分贝为A的信号量为M ,B的信号量为N
信号量A初始值-B的最小值要=M 而初始B的最小值为0,得到A信号量值为M
同理得到信号量B
比如放A要A先获取其自己信号量,成功放了后,增加B的信号量
B类似
这样的流程就能保证约束(2)

代码如下:

public class Problem_07 {

    public static void main(String argv[]){
        new Thread(new A()).start();
        new Thread(new B()).start();
    }

    private static class DB{
        public static final int aMaxSeqSize = 5;
        public static final int bMaxSeqSize = 3;
        public static Semaphore dbMutexSem = new Semaphore(1);
        public static Semaphore aSeqSizeSem = new Semaphore(aMaxSeqSize);
        public static Semaphore bSeqSizeSem =  new Semaphore(bMaxSeqSize);
    }

    private static class A implements Runnable{
        @Override
        public void run() {
            for(int loop=0; loop<10; loop++){
                try {
                    DB.aSeqSizeSem.acquire();
                    DB.dbMutexSem.acquire();
                    System.out.printf("A\n");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    DB.dbMutexSem.release();
                    DB.bSeqSizeSem.release();
                }
            }
        }
    }

    private static class B implements Runnable{
        @Override
        public void run() {
            for(int loop=0; loop<10; loop++){
                try {
                    DB.bSeqSizeSem.acquire();
                    DB.dbMutexSem.acquire();
                    System.out.printf("B\n");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    DB.dbMutexSem.release();
                    DB.aSeqSizeSem.release();
                }
            }
        }
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值