1.生产者–消费者问题
分析:
·无论生产者、消费者使用缓冲池时应保证互斥使用(互斥信号量mutex)
·生产者和消费者间交叉有序:
有序的控制最根源在产品的数量上
需要设置两个信号量:
分别针对生产者、消费者设置不同的信号量,empty(空缓冲池数)和full(满缓冲池数)
程序:
消费者
生产者
当两个生产者同时的情况
由于m的值为1,第一个生产者到达,执行了wait(m),m的值为0,如果此时第二个人来再次执行wait(m)时,m的值减为-1会使第二个人阻塞,第二个人必须等到第一个人操作完后,释放m才能被唤醒继续操作,避免了两个生产者同时生产带来的问题。
生产者等待消费者情况
此时条件:e=0(空缓冲池为0),m=1,f=n(全为满缓冲池)
由上代码可知,生产者生产时先申请e(空缓冲),执行wait(e)后,e=-1阻塞,必须等到消费者取完后执行了signal(e),释放e后才会唤醒生产者继续操作。
2.哲学家就餐问题
分析:
筷子在此处为临界资源,在一段时间内只允许一个哲学家使用
如果每个哲学家都取得一只筷子,那么则会造成死锁问题
解决方法:
**数量控制:**至多只允许有四位哲学家同时去拿左边筷子,这样便可保证至少有一位科学家能够进餐,并在用完后释放两只筷子
采用AND信号量
仅当哲学家的左右两只筷子均可用时,才能允许他拿起筷子进餐。
IF编程控制
规定奇数号哲学家先拿左筷子后拿右筷子,偶数号哲学家反之,这样便能保证总会有一个哲学家能同时获得两只筷子。
3.读者–写者问题
分析:
合理的同步关系
多个读进程可同时读,写进程与任何其他进程不允许同时访问文件