持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情
线程同步互斥的经典问题
-
生产者消费者问题
-
问题描述
- 互斥关系:生产者消费者互斥访问缓冲区
- 同步关系:生产供应消费
-
问题解决
-
mutex=1,empty=n,full=0
-
PV顺序
- 实现互斥的p操作一定要在实现同步的p操作之后(否则会死锁)
- 两个V操作顺序可以互换
-
-
-
-
多生产者多消费者问题
-
问题描述
- 爸妈分别放桔子和苹果,儿子女儿分别吃掉
-
互斥,同步关系
-
互斥关系: 对缓冲区(盘子)的访问要互斥地进行
-
同步关系:
- 父亲将苹果放入盘子后,女儿才能取苹果
- 母亲将橘子放入盘子后,儿子才能取橘子
- 只有盘子为空时,父亲或母亲才能放入水果
-
-
问题解决
- mutex=1,apple=0,orange=0,plate=1
- 如果不设置mutex=1也可以(因为plate=1)
-
-
吸烟者问题
-
问题描述
- 抽烟需要三种材料,吸烟者只有一种,供应者每次将两种材料放桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者进程一个信号告诉完成了,供应者就会放另外两种材料再桌上,这个过程一直重复(让三个抽烟者轮流地抽烟)
-
互斥,同步关系
- 互斥关系:没有,因为桌子上的东西只有对应的一个人能取走
- 同步关系: 1.提供者提供东西抽烟者才能取走 2.发出完成信号供应者才能将下一个组合放到桌上
-
解决办法
-
-
读者写者问题
-
问题描述
- ①允许多个读者可以同时对文件执行读操作; ②只允许一个写者往文件中写信息; ③任一写者在完成写操作之前不允许其他读者或写者工作; ④写者执行写操作前,应让已有的读者和写者全部退出。
-
互斥,同步关系
- 互斥关系: 写进程—写进程、 写进程—读进程, 加入读者计数器,不同读者对计数器的访问也是互斥的。
- 同步关系:
-
问题解决
-
读进程优先
-
-
特点
- 由于写进程与任何进程都互斥,所以对写进程只需要设置rw互斥访问即可
- 增加记录读者数量的int型变量count,且count的修改需要互斥进行
- 第一个读进程要阻止写进程,最后一个读进程要释放写进程
-
缺点
- 优先读进程,可能导致写进程饥饿
-
-
相对的写优先
- 增加 w 用于实现写优先
- 相对公平的先来先服务
-
-
-
哲学家进餐问题
-
问题描述
- 一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。哲学家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿时,才试图拿起左、右两根筷子(一根一根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿起两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。
-
互斥同步关系
- 互斥关系:5名哲学家与左右邻居对中间筷子的访问互斥的
-
信号量设置
- 定义互斥信号量数组 chopstick[5]={1,1,1,1,1} 用于实现对5个筷子的互斥访问。并对哲学家按0~4编号,哲学家 i 左边的筷子编号为 i,右边的筷子编号为 (i+1)%5。
-
解决办法
- 至多允许4名哲学家同时进餐
- 奇数号哲学家先拿左边的筷子,偶数号哲学家先拿右边的筷子
- 仅当左右两边筷子都能用的时候才允许拿起(同时拿起两双筷子)
-