线程同步互斥的经典问题
【摘要】 经典问题生产者消费者问题问题描述互斥关系:生产者消费者互斥访问缓冲区同步关系:生产供应消费问题解决mutex=1,empty=n,full=0PV顺序实现互斥的p操作一定要在实现同步的p操作之后(否则会死锁)两个V操作顺序可以互换多生产者多消费者问题问题描述爸妈分别放桔子和苹果,儿子女儿分别吃掉互斥,同步关系互斥关系:对缓冲区(盘子)的访问要互斥地进行同步关系:父亲将苹果放入盘子后,女儿才...
经典问题
-
生产者消费者问题
-
问题描述
- 互斥关系:生产者消费者互斥访问缓冲区
- 同步关系:生产供应消费
-
问题解决
-
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名哲学家同时进餐
- 奇数号哲学家先拿左边的筷子,偶数号哲学家先拿右边的筷子
- 仅当左右两边筷子都能用的时候才允许拿起(同时拿起两双筷子)
-
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)