我的女儿二三事(四)

    女儿长大一些了,越来越会表达一些自己的想法了,我们也能更多的明白她的意思而不是纯靠猜了。在晚上带她出去走走的时候,想想该写一篇她最近的改变了。
    可能在我眼里,女儿带给我的更多的是美好的回忆,因为在哪些艰难的时候,孩子哭闹无助,照料孩子的餐前饭后,更多的时候,都是父母和媳妇在张罗这些事情,每天晚上到了快10点的样子,这就是我的工作时间了,洋洋洒洒写点儿感想,认真总结些每天的技术心得,而忙完之后拖着疲惫的身子会到房间,孩子已经睡得香甜。
    如果按照孩子对家里人的亲密程度来说,妈妈是最高的,下来是爷爷奶奶,偶尔我会排在第二位,不过应该大多数的时候我还是排在倒数第一,好像家里就无形存在着一个排行版一般,能从孩子的态度中感受得到。我不知道爸爸妈妈,爷爷奶奶在她眼里意味着什么,不过应该不是她脑海中的概念,怎么说呢,妈妈最大,有时候我和媳妇在街上走,媳妇抱着孩子,然后媳妇同时挽着我的胳膊,这个时候孩子就不愿意了,看到这样就练练摆手说,不行不行。看着媳妇得意的表情,有时候我就笑着说,这孩子真是白养了。
    不过孩子在我和爷爷之间,可能对我还比较亲一些。到了超市,我出去推购物车,没想到爸已经找到一辆,他们就在那儿等,孩子坐在那里,端端的看着门口,在人群里喊着爸爸,直到我和她目光相遇,走到她目前,她才作罢。
    有时候孩子做错了事情我对她可能会急一些,比如她拿到了我的IPAD,结果我转头的时候,PAD掉到了地上,我可能语言就会严厉一些,然后孩子就会突然反应几秒钟,然后开始哇哇大哭,眼泪就顺着脸颊哗哗的,这一下子我就成了罪人,孩子会哭着然后去找妈妈,我想这个时候孩子肯定会很讨厌我了,但是没过一会,我教她说话,她还是会接上学学,好娃娃,哇哈哈。。。要出门的时候还是会把鞋子扔到我面前,然后像个大人一样推着踏板车在楼道里,嘴里模模糊糊的说着,走,走。。。
    有时候在散步的时候,她会保持很大的好奇心,如果她推着自己的踏板车不小心碰到了停在路边的车,就会过去,然后按照我教她的,嘴里说着"摸摸“,抚摸,安逸的意思,然后下一秒就会小脸凑过去,亲亲车身,这个时候我都来不及上前制止。只好一边笑着一脸赶紧拉着她走开。
    然后没走多就,看着一个饭馆门口有两个石狮,她会煞有介事的过去,摸摸小狮子,然后在我的催促下离开的时候还念念有词的说“拜拜”,可能在孩子的眼里,任何事物都是有生命的,所以在超市里的时候,我带着她看哪里的鱼儿的时候,心里就很纠结,她会给鱼儿招手问好,但是我还是忍不住会想这些鱼儿其实也是身不由己,生命随时都可能终结,而这些对于一个刚满两岁的孩子而言,可能还是一个很难去解释的问题,所幸她还是咿咿呀呀的看着,时而看着鱼儿哈哈大笑,时而端详着它们。
    孩子的世界就是一片纯净无暇的宝地,有时候她的好奇心还会让我不由得想到更多的事情,比如有时候她走着走着,突然停下来,看着眼前的东西,我凑过去,发现原来是仍在地上的垃圾,我想她可能在想,为什么会有垃圾呢,垃圾不是应该在垃圾箱吗。因为在家里的时候她已经认识垃圾桶了,我们会教她往里面扔垃圾,她在路上的时候也会远远的指着垃圾箱说“垃圾,垃圾”,在家里,我偶尔客串一下晚读的角色,有时候给她讲完故事,就会教她把书收起来放进抽屉,她总是乐呵呵的去做。
    在卫生方面,我们也做了不少的努力,以前孩子总是会没有清晰的概念,有地上大小便的习惯,家里专门买了个小马桶,但是她不乐意用,所以一直以来收拾就很费劲,而且很不卫生,为此我们还把最近的尿不湿留下来,顺带处理臭臭,也是在国庆左右,在媳妇的努力下,终于让孩子习惯了小马桶,这下用过的尿不湿就不用屯了,卫生境况大大改观。无规矩不成方圆,在这方面孩子的进步也是有目共睹,尿裤子的时候也少了很多,她会提前告诉你要大小便了,然后我们就开始带着她处理,在外面的时候也是如此。我想我们也算是孩子文明了一小步。
    有时候想想我和孩子还是有些蛮有意思的小插曲,比如前几天我哄她睡觉的时候,她总是不太容易入睡,在我怀里翻过来动个不停,我还纳闷是怎么回事,她就暗示我转个方向,然后看着我哈哈大笑,好像一个懂事的大人一般,我矫正姿势之后还真时有效果,眼睛迷离了一会就睡着了,偶尔会睁开眼,简单看看,然后继续睡。
    孩子毕竟不是一个人,有不少的时间是需要和外面的世界交流的,所以在和小朋友玩耍的时候,就很容易有一个问题,那就是抢东西,有几次我是看着闺女不由分说上前就拿到了其他小朋友的玩具,那个小朋友也不乐意,然后就和她抢,然后我也在告诉闺女,这个是别的小朋友的,然后就可能出现两个孩子都哭起来,然后双方的家长都笑笑了事。有时候孩子还是很乐于分享,还是得看心情,这个方面还是要不断加强。
    超市里,我们漫无目的的走着,现在看看啥都买得起,啥都不想吃,而以前是啥都想买,啥都买不起,清晰的记得以前对我来说最好的零食就是山楂片和兰花豆,现在似乎已经很难让我提起兴趣了。而带着孩子在其中,俨然是一个生活大课堂,我会指着里面的货物给她讲,哪些是能吃的,哪些不能吃,然后她就会咿咿呀呀的笑着,可能和她相处的时间总是很有限,而我看着她的样子,总是会想孩子长大以后会是个什么样子。美好的一天,晚安。

相关阅读:
我的女儿二三事(三)  http://blog.itpub.net/23718752/viewspace-2123103/
我的女儿二三事(二) http://blog.itpub.net/23718752/viewspace-2122759/
我的女儿二三事     http://blog.itpub.net/23718752/viewspace-1978668/
<think>嗯,这个问题看起来是关于进程同步的,用信号量来解决生产者-消费者问题的变种。我得仔细看看题目要求。题目里说有一个盘子,最多能放两个水果,而且访问要互斥。爸爸放苹果,妈妈放橘子,女儿吃苹果,儿子吃橘子。需要实现个进程的同步。 首先,我得确定有几个资源需要考虑。盘子最多放两个,所以盘子的容量是资源之一。然后,苹果和橘子是不同的资源,可能需要分开的信号量。因为爸爸和妈妈是生产者,女儿和儿子是消费者。不过盘子同时可以放两个水果,但需要互斥访问,所以可能需要一个互斥信号量。 互斥访问盘子,应该用一个mutex信号量,初始为1,保证同时只有一个进程访问盘子。然后盘子里的空位,可能需要一个信号量empty,初始为2,每放一个水果就减少,直到0的时候不能再放。但这样的话,当盘子有一个水果时,另一个生产者还能放第二个,但需要互斥。或者是否要考虑苹果和橘子各自的信号量? 不过题目中的女儿只吃苹果,儿子只吃橘子,所以可能需要两个不同的信号量来表示苹果和橘子的数量。比如,apple和orange,初始都是0。当爸爸放苹果时,释放一个apple信号量,妈妈放橘子时释放orange。然后女儿等待apple信号量,儿子等待orange。 同时,盘子的容量是两个,所以可能需要一个信号量empty来代表剩余空间,初始是2。每次放水果前需要申请empty,放完后如果是苹果或橘子,就增加对应的信号量。而消费者取水果后,释放empty的空间。 另外,互斥的问题,因为盘子是共享资源,所以在放和取的时候都需要互斥访问,所以mutex用来保护对盘子的操作。比如,爸爸放苹果的时候,需要先检查是否有空位,然后获取mutex,放入苹果,释放mutex,并增加apple的信号量。而女儿吃的时候,需要等待apple信号量,获取mutex,取出苹果,释放mutex,并增加empty的信号量。 这样的话,可能需要以下几个信号量: - mutex:互斥访问盘子,初始1 - empty:剩余空位,初始2 - apple:苹果的数量,初始0 - orange:橘子的数量,初始0 然后,爸爸的进程: 爸爸要放苹果,首先等待empty是否有空位,如果有,就获取empty,然后获取mutex,放入苹果,释放mutex,然后释放apple信号量,让女儿可以消费。 妈妈的进程类似,不过释放的是orange。 女儿的进程是等待apple信号量,然后获取mutex,取出苹果,释放mutex,并释放empty。 儿子则等待orange信号量,获取mutex,取出橘子,释放mutex,释放empty。 但是这样是否正确呢?比如,当盘子有两个空位时,爸爸和妈妈可以各自放一个,或者其中一个放两个?但是题目中每次只能放一个水果,所以爸爸每次放一个苹果,妈妈每次放一个橘子。所以每个生产者每次操作只放一个,而消费者每次取一个。 所以,当爸爸要放的时候,先检查是否有空位(empty >=1),如果有,P(empty),然后获取mutex,放入苹果,V(apple),然后释放mutex。同样,妈妈则V(orange)。 而女儿消费时,P(apple),然后获取mutex,取苹果,V(empty),释放mutex。儿子类似,P(orange),取橘子,V(empty)。 这样是否可行?可能存在这样的情况:当盘子满了(两个水果),这时候empty为0,生产者无法再放。当消费者取一个后,empty增加1,允许生产者继续。 不过需要注意,盘子里可以同时存在两个苹果,或者两个橘子,或者一个苹果一个橘子。但题目中并没有限制水果的种类,只要求最多两个。因此,这样的信号量设置应该可以满足条件,因为empty控制总数量,而apple和orange分别控制各自的资源数量。 但是,是否会出现互斥的问题?比如,当两个生产者同时试图放入水果时,比如爸爸和妈妈同时执行,但由于mutex的存在,他们必须顺序执行。比如,爸爸先获取mutex,放入苹果,然后释放;妈妈再获取,放入橘子,这样盘子有两个水果。或者如果爸爸连续放两次,但因为每次放之前都要获取empty,如果empty初始为2,爸爸第一次放,empty减到1,再次放时,如果此时没有其他进程,可以再次放,但此时empty减到0。但是根据题目,爸爸每次只能放一个苹果,所以每个放的操作都是独立的,所以可能允许同一个生产者连续放两次,只要不超过容量。但题目中是否允许盘子里有两个苹果?题目没有说不行,只是说最多两个水果,所以是允许的。例如,爸爸连续放两个苹果,然后女儿吃两次。但妈妈放橘子的话,可能和爸爸交替。 不过按照上面的信号量设置,这样的情况是允许的。但可能题目中的“互斥访问”指的是对盘子的操作需要互斥,即不能同时放入或取出,所以mutex是正确的。 现在需要检查这样的设置是否会导致死锁或者不符合条件的情况。例如,当盘子有一个苹果和一个橘子时,empty为0。此时女儿可以取苹果(apple为1),儿子可以取橘子(orange为1)。如果女儿取了苹果,empty变为1,此时爸爸或妈妈可以放入。而如果此时妈妈放入橘子,orange变为2,但empty又减到0。这时候儿子可以取两次橘子,对吗? 但根据题目,每次只能放入一个水果,所以没问题。因为生产者每次只能放一个,消费者每次只能取一个。 因此,信号量的设置应该是: semaphore mutex = 1; // 互斥访问盘子 semaphore empty = 2; // 剩余空位 semaphore apple = 0; // 苹果数量 semaphore orange = 0; // 橘子数量 爸爸进程: while(true) { P(empty); // 申请空位 P(mutex); // 进入临界区 放苹果; V(mutex); V(apple); // 增加苹果数量 } 妈妈进程: while(true) { P(empty); P(mutex); 放橘子; V(mutex); V(orange); } 女儿进程: while(true) { P(apple); // 等待苹果 P(mutex); 取苹果; V(mutex); V(empty); // 释放空位 吃苹果; } 儿子进程: while(true) { P(orange); P(mutex); 取橘子; V(mutex); V(empty); 吃橘子; } 但是这里有个问题:女儿在P(apple)之后,再获取mutex,这样可能导致死锁吗?比如,当女儿已经获取了apple信号量,但此时mutex被其他进程占用,无法继续。但按照常规的生产者消费者模型,通常是在进入临界区之前申请资源信号量。比如,消费者先申请资源(如apple),然后再申请互斥锁。这应该是可以的,因为资源信号量的P操作会阻塞直到有资源可用。此时,当女儿拿到apple信号量,说明有一个苹果存在,这时候她需要进入临界区去取,此时必须获得mutex。如果有其他进程在操作盘子,比如爸爸或妈妈正在放水果,那么女儿会等待mutex。但一旦mutex被释放,女儿就能继续。所以这种情况不会导致死锁,只是正常的等待。 但是,这里可能存在一个顺序问题。比如,是否应该先获取互斥锁再申请资源?比如,在生产者中,先P(empty),再P(mutex)。这样是否正确?因为如果生产者先申请empty,表示有空位,然后获取mutex,放入水果。这没问题。而如果反过来,先获取mutex再申请empty,可能会导致死锁,比如当empty为0时,生产者持有mutex并等待empty,而消费者无法进入临界区释放empty。因此正确的顺序应该是先申请资源信号量(empty),再申请互斥锁。 同样,在消费者中,先申请资源信号量(apple或orange),然后申请mutex,这样是正确的顺序。比如,女儿先P(apple),表示有苹果可用,然后申请mutex,取出苹果,释放mutex,再释放empty。这样顺序是对的。 所以上面的代码结构是正确的。 那这样就能满足题目的要求了吗? 当盘子为空时,empty=2。爸爸和妈妈可以各放一个水果,或者其中一个放两个。比如,爸爸连续放两个苹果,此时empty=0,apple=2。女儿可以取两次,每次取一个苹果,释放empty,此时empty回到2。或者女儿和儿子同时取,如果有橘子的话。 但题目中,如果盘子里有两个苹果,女儿可以取两次,对吗?是的,因为女儿只关心苹果的存在。而如果盘子里有一个苹果和一个橘子,女儿和儿子可以同时取,但根据mutex的存在,他们必须顺序执行。比如,女儿先取苹果,然后儿子取橘子,或者反过来。 所以这样的信号量设置应该可以满足同步的要求,并且互斥访问盘子,保证不会出现同时访问的问题。 总结一下,信号量的设置和进程的操作应该是这样的。这可能就是正确的解决方案。</think>以下是使用信号量解决该同步问题的分步说明: $$ semaphore\ mutex = 1;\quad // 互斥访问盘子 semaphore\ empty = 2;\ \ // 盘子剩余空间 semaphore\ apple = 0;\ \ \ // 苹果数量 semaphore\ orange = 0;\ // 橘子数量 $$ ### 一、问题分析关键点 1. **互斥访问**:盘子作为共享资源,需要保证同一时间只有一个进程操作 2. **容量限制**:盘子最多容纳2个水果,通过`empty`控制 3. **生产者-消费者关系**: - 爸爸生产苹果 → 女儿消费苹果 - 妈妈生产橘子 → 儿子消费橘子 4. **资源分离**:苹果和橘子需用独立信号量区分 ### 二、进程伪代码实现 #### 爸爸进程(生产苹果) ```c while(true) { P(empty); // 等待空位 P(mutex); // 申请进入临界区 放一个苹果到盘中; V(mutex); // 离开临界区 V(apple); // 增加苹果可用数量 } ``` #### 妈妈进程(生产橘子) ```c while(true) { P(empty); // 等待空位 P(mutex); // 申请进入临界区 放一个橘子到盘中; V(mutex); // 离开临界区 V(orange); // 增加橘子可用数量 } ``` #### 女儿进程(消费苹果) ```c while(true) { P(apple); // 等待苹果可用 P(mutex); // 申请进入临界区 从盘中取出苹果; V(mutex); // 离开临界区 V(empty); // 释放一个空位 吃苹果; } ``` #### 儿子进程(消费橘子) ```c while(true) { P(orange); // 等待橘子可用 P(mutex); // 申请进入临界区 从盘中取出橘子; V(mutex); // 离开临界区 V(empty); // 释放一个空位 吃橘子; } ``` ### 三、同步过程说明 1. **生产者限制**:当`empty=0`时,父母进程会被阻塞,确保盘子不超载 2. **消费者限制**:当`apple=0`或`orange=0`时,子女进程自动等待 3. **互斥保障**:任何进程操作盘子前必须通过`P(mutex)`获得独占权 4. **资源释放**:子女消费后通过`V(empty)`通知生产者有空位可用 ### 、典型场景示例 1. **初始状态**:`empty=2`, `apple=0`, `orange=0` 2. **爸爸放苹果**:`empty-- → 1`, `apple++ → 1` 3. **妈妈放橘子**:`empty-- → 0`, `orange++ → 1` 4. **女儿取苹果**:`apple-- → 0`, `empty++ → 1` 5. **儿子取橘子**:`orange-- → 0`, `empty++ → 2` 该方案通过分离水果类型信号量,确保子女只能消费对应类型的水果,同时严格遵守容量限制与互斥访问要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值