生产者消费者问题(吸烟者问题)
同步:生产了产品才能被消费、消费完了才有空位才能重新生产;也就是full和empty之间的关系
full表示还有多少个产品可以消费
empty表示还有多少个空位可以重新生产(注意初值)
生产者过程:
首先需要一个空位p(empty)
生产完后多了一个产品v(full)
消费者过程:
首先需要一个产品p(full)
消费完后多了一个空位v(empty)
互斥:注意哪些东西不能同时访问 mutex 初值为1
读者写者问题
读者写者问题主要是为了解决互斥问题。读和读之间可以同时访问;读和写、写和写之间是互斥的
引入计数器counter;表示读的人
互斥
mutex
写过程是不容其他过程的,可以直接P(mutex)
而读过程P(mutex)受计数器counter的影响;需要考虑是不是第一个读进程(负责P);以及退出时是不是最后一个推出的(负责V)
rw,读写之间的互斥
哲学家问题
哲学家问题的关键时限制并行,三种思路
1、限制申请条件(破坏死锁条件)
比如规定单号哲学家先取左边;双号(if i%2==0)哲学家先取右边筷子
2、限制信号量并行数
如:限制同一时间只能有一个哲学家就餐(禁止并行)
3、限制哲学家只有取得两只筷子时才能就餐(破坏死锁条件)
理发师问题(涉及取号叫号)
理发师、营业员都是这一类
同步:顾客的取号和工作人员的叫号通过同步信号量实现,顾客到达取号后就P操作排队,因为信号量机制中P会把自己阻塞并进入阻塞队列。先来的顾客就在前面
互斥:取号机只有一个;可以通过队列实现叫号
做题技巧
1.审题 找对应题型
2.找到临界资源 确定互斥信号量
3.找到进程之间的同步关系 确定同步信号量
4.写出代码 添加注释
5.回顾题目 看是否满足要求
6.外层写同步信号量;内层写互斥信号量(反了的话可能会出问题)
1 | P(empty) |