舍不得删宝宝和朋友们的的聊天记录,每天下班之后都能安心的睡一大觉,朦朦胧胧中宝宝中途会来看我有没有踢被子,把我哄睡着之后就继续下去上班了~虽然两个都很宅很忙但是都有很多个人空间和自己的朋友聊天玩游戏,手机一开始就坦诚用了一个密码随时开随时拿~下雨天打死都不出门在房间里各玩各的[心]老板娘布置的任务也能各自完成,大家的房间都是收拾的干干净净的香香的[兔子]有时候进对方房间也会顺手帮对方收拾[赢牛奶]
周日三姨来家里陪我住到了周三才走,期间让我在干干净净的家里过上了下班到家就能吃上饭中午十二点能悠闲躺在沙发上的快乐日子,好开心❤️
财务小哥要回公司了少了个说话的人,但是换了一个姐姐在今天中午聚餐的时候感觉还不错,还很有仪式感地见到了超大剁椒鱼头的开盖仪式,好开心❤️
下午经理骑着我的车去拿荔枝快递,然后晚上准备下班吃饭发现车爆胎了,但是这箱荔枝好好吃好好吃,忍不住吃了好多个,因为没车跟同事们走路去吃饭也很热闹!好开心❤️
晚上参加同事的生日见到了离职的好朋友好开开心❤️ 大家痛痛快快畅聊四个小时一起吐槽公司好开心❤️ 吃冰激凌蛋糕好开心❤️
散场后我突然提了一嘴大家好久没打麻将了他们立刻带着我去打麻将好开心!更开心是打到后面手气大爆棚在本命年难得地成了大赢家赢了80块好开心!❤️
打完麻将回来虽然好困但是拿上楼两个快递,一个是自己的护肤水补给,一个是大学同学寄的芒果好开心!!!❤️
噢噢本周还学会了用发簪盘头发,但我并没有发簪,于是我用apple pencil.用铅笔用眉笔用各种条状物练手,啊~开心呀我❤️
好多好多好多的开心!!!上一次写此类型的开心日记还是在2021年5月,久违地记录自己一天中的需求开心❤️
正在脱敏期,会越来越好[兔子]
财务小哥要回公司了少了个说话的人,但是换了一个姐姐在今天中午聚餐的时候感觉还不错,还很有仪式感地见到了超大剁椒鱼头的开盖仪式,好开心❤️
下午经理骑着我的车去拿荔枝快递,然后晚上准备下班吃饭发现车爆胎了,但是这箱荔枝好好吃好好吃,忍不住吃了好多个,因为没车跟同事们走路去吃饭也很热闹!好开心❤️
晚上参加同事的生日见到了离职的好朋友好开开心❤️ 大家痛痛快快畅聊四个小时一起吐槽公司好开心❤️ 吃冰激凌蛋糕好开心❤️
散场后我突然提了一嘴大家好久没打麻将了他们立刻带着我去打麻将好开心!更开心是打到后面手气大爆棚在本命年难得地成了大赢家赢了80块好开心!❤️
打完麻将回来虽然好困但是拿上楼两个快递,一个是自己的护肤水补给,一个是大学同学寄的芒果好开心!!!❤️
噢噢本周还学会了用发簪盘头发,但我并没有发簪,于是我用apple pencil.用铅笔用眉笔用各种条状物练手,啊~开心呀我❤️
好多好多好多的开心!!!上一次写此类型的开心日记还是在2021年5月,久违地记录自己一天中的需求开心❤️
正在脱敏期,会越来越好[兔子]
用餐哲学问题
现在我们来谈谈Dijkstra[DIJK71]提出的用餐哲学家问题。五位哲学家住在一所房子里,房子里摆着一张桌子。每一位哲学家的生活主要包括思考和饮食,经过多年的思考,所有哲学家都一致认为,对他们的思考做出贡献的唯一食物是意大利面条。由于缺乏手工技能,每个哲学家吃意大利面都需要两把叉子。
用餐安排很简单(见图6.11):圆桌会议上有一大碗意大利面、五个盘子。每个哲学家一个盘子和五把叉子。一个想吃饭的哲学家走到他或她在餐桌上指定的位置,用盘子旁边的两把叉子,拿着意大利面吃。问题是:设计一个仪式(算法),允许哲学家吃饭。算法必须满足互斥(没有两个哲学家可以同时使用同一个叉子),同时避免死锁和停滞(在这种情况下,这个词既有字面意义,也有算法意义!)。
这个问题本身可能并不重要或相关。然而,它确实说明了死锁和饥饿中的基本问题。此外,开发解决方案的尝试揭示了并发编程中的许多困难(例如,参见[GING90])。此外,用餐哲学家问题可以被视为处理共享资源协调的问题的代表,当应用程序包括执行的并发线程时,可能会发生这种情况。因此,这个问题是评估同步方法的标准测试案例。
使用信号量的解决方案
图6.12建议使用信号量的解决方案。每个哲学家先拿起左边的叉子,然后拿起右边的叉子。哲学家吃完后,把两个叉子放在桌子上。遗憾的是,这种解决方案会导致死锁:如果所有的哲学家都同时饿了,他们都会坐下来,拿起左边的叉子,然后伸手去拿另一个不在那里的叉子。在这种不体面的方式下,所有的哲学家都会挨饿。
为了克服死锁的风险,我们可以多买五把叉子(更卫生的解决方案!),或者教哲学家只用一把叉子吃意大利面。作为另一种方法,我们可以考虑增加一个一次只允许四个哲学家进入餐厅的服务员。最多有四位坐着的哲学家,至少有一位哲学家可以使用两个叉子。图6.13显示了这样一个解决方案,再次使用信号量。这个解决方案没有死锁和饥饿。
使用监视器的解决方案
图6.14显示了使用监视器解决哲学家就餐问题的方法。定义了五个条件变量的向量,每个fork一个条件变量。这些条件变量用于让哲学家等待叉子的可用性。此外,还有一个布尔向量记录每个叉子的可用状态(true表示叉子可用)。监视器由两个程序组成。哲学家使用get_forks程序来确定他或她的左右叉子。如果其中一个fork不可用,则哲学家进程将在适当的条件变量上排队。这使另一个哲学家进程能够进入监视器。使用
release-forks程序来提供两个叉子。请注意,此解决方案的结构与图6.12中提出的信号处理方案的结构相似。在这两种情况下,哲学首先抓住左叉,然后抓住右叉。与信号处理方案不同,此监视器解决方案不会出现死锁,因为监视器中一次只能有一个进程。例如,进入监视器的第一个哲学家进程保证在右边哲学家有机会抓住他或她的左叉子之前,它可以在拿起左叉子之后拿起右叉子,这就是这个哲学家的右叉子。
现在我们来谈谈Dijkstra[DIJK71]提出的用餐哲学家问题。五位哲学家住在一所房子里,房子里摆着一张桌子。每一位哲学家的生活主要包括思考和饮食,经过多年的思考,所有哲学家都一致认为,对他们的思考做出贡献的唯一食物是意大利面条。由于缺乏手工技能,每个哲学家吃意大利面都需要两把叉子。
用餐安排很简单(见图6.11):圆桌会议上有一大碗意大利面、五个盘子。每个哲学家一个盘子和五把叉子。一个想吃饭的哲学家走到他或她在餐桌上指定的位置,用盘子旁边的两把叉子,拿着意大利面吃。问题是:设计一个仪式(算法),允许哲学家吃饭。算法必须满足互斥(没有两个哲学家可以同时使用同一个叉子),同时避免死锁和停滞(在这种情况下,这个词既有字面意义,也有算法意义!)。
这个问题本身可能并不重要或相关。然而,它确实说明了死锁和饥饿中的基本问题。此外,开发解决方案的尝试揭示了并发编程中的许多困难(例如,参见[GING90])。此外,用餐哲学家问题可以被视为处理共享资源协调的问题的代表,当应用程序包括执行的并发线程时,可能会发生这种情况。因此,这个问题是评估同步方法的标准测试案例。
使用信号量的解决方案
图6.12建议使用信号量的解决方案。每个哲学家先拿起左边的叉子,然后拿起右边的叉子。哲学家吃完后,把两个叉子放在桌子上。遗憾的是,这种解决方案会导致死锁:如果所有的哲学家都同时饿了,他们都会坐下来,拿起左边的叉子,然后伸手去拿另一个不在那里的叉子。在这种不体面的方式下,所有的哲学家都会挨饿。
为了克服死锁的风险,我们可以多买五把叉子(更卫生的解决方案!),或者教哲学家只用一把叉子吃意大利面。作为另一种方法,我们可以考虑增加一个一次只允许四个哲学家进入餐厅的服务员。最多有四位坐着的哲学家,至少有一位哲学家可以使用两个叉子。图6.13显示了这样一个解决方案,再次使用信号量。这个解决方案没有死锁和饥饿。
使用监视器的解决方案
图6.14显示了使用监视器解决哲学家就餐问题的方法。定义了五个条件变量的向量,每个fork一个条件变量。这些条件变量用于让哲学家等待叉子的可用性。此外,还有一个布尔向量记录每个叉子的可用状态(true表示叉子可用)。监视器由两个程序组成。哲学家使用get_forks程序来确定他或她的左右叉子。如果其中一个fork不可用,则哲学家进程将在适当的条件变量上排队。这使另一个哲学家进程能够进入监视器。使用
release-forks程序来提供两个叉子。请注意,此解决方案的结构与图6.12中提出的信号处理方案的结构相似。在这两种情况下,哲学首先抓住左叉,然后抓住右叉。与信号处理方案不同,此监视器解决方案不会出现死锁,因为监视器中一次只能有一个进程。例如,进入监视器的第一个哲学家进程保证在右边哲学家有机会抓住他或她的左叉子之前,它可以在拿起左叉子之后拿起右叉子,这就是这个哲学家的右叉子。
✋热门推荐