第七章 不太遥远的经典问题

 

7.2 儿童保育问题

Max Hailperin为他的教科书《操作系统和中间件》[5]编写了这个问题。 州法规要求,在儿童保育中心,每三个孩子总要有一个成年人在场。

思考:为孩子线程和成人线程编写代码,在临界区强制执行此约束。

 

7.2.1 儿童保育提示

Hailperin建议你可以用一个信号量来解决这个问题。

The Little Book of Semaphores 信号量小书 第七章 不太遥远的经典问题 7.2 儿童保育问题

multiplex计算可用令牌的数量,其中每个令牌允许一个孩子线程进入。 当成年人进入时,他们发出三次multiplex信号(signal); 当他们离开时,他们等待(wait)三次。 但是这个解决方案存在一个问题。

思考:问题是什么?

 

7.2.2 儿童保育非解决方案

以下是Hailperin非解决方案中成人代码的样子:

The Little Book of Semaphores 信号量小书 第七章 不太遥远的经典问题 7.2 儿童保育问题

问题是存在潜在的死锁。 想象一下,幼儿中心有三个孩子和两个成年人。 multiplex的值是3,所以任何成年人都应该能够离开。 但如果两个成年人同时开始离开,他们可能会将他们之间的可用令牌分开,并且两者都会阻塞。

思考:用最小的改变解决这个问题。

 

7.2.3 儿童保育方案

添加互斥锁可以解决问题:

The Little Book of Semaphores 信号量小书 第七章 不太遥远的经典问题 7.2 儿童保育问题

现在这三个等待操作都是原子的。 如果有三个令牌可用,则获取互斥锁的线程将获得所有三个令牌并退出。 如果可用的令牌较少,则第一个线程将在互斥锁中阻塞,后续线程将在互斥锁上排队。

 

7.2.4 扩展的儿童保育问题

这个解决方案的一个特点是,等待离开的成人线程可以防止孩子线程进入。

想象一下,有四个孩子和两个成年人,所以multiplex的值是2。如果其中一个成年人试图离开,她将取两个令牌,然后在等待第三个时阻塞。 如果孩子线程到达,它将等待,即使进入是合法的。 从成年人试图离开的角度来看,这或许很好,但如果你想最大限度地利用儿童保育中心,那就不是了。

思考:写一个解决这个问题的方法,避免不必要的等待。

提示:想想3.8节中的舞者。

 

7.2.5 扩展的儿童保育提示

以下是我在解决方案中使用的变量:

The Little Book of Semaphores 信号量小书 第七章 不太遥远的经典问题 7.2 儿童保育问题

children, adults, waiting和leaving记录儿童,成人,等待进入的儿童以及等待离开的成年人的数量; 它们受互斥锁mutex保护。

如果有必要,孩子进入时等待childQueue。成年人离开时等待adultQueue。

 

7.2.6 扩展的儿童保育方案

这个解决方案比Hailperin的优雅解决方案更复杂,但是它主要是我们以前见过的模式的组合:记分牌、两个队列,以及“我为您做”。

这是孩子的代码:

The Little Book of Semaphores 信号量小书 第七章 不太遥远的经典问题 7.2 儿童保育问题

当孩子进入时,他们检查是否有足够的成人,或者(1)递增children并进入,或者(2)递增waiting并阻塞。当他们离开时,他们检查正在等待离开的成人线程,如果有的话就向他发出信号。

 

这是成人的代码:

The Little Book of Semaphores 信号量小书 第七章 不太遥远的经典问题 7.2 儿童保育问题

当成人进入时,他们会向等待的孩子发出信号。 在他们离开之前,他们会检查是否有足够的成年人离开。 如果是这样,他们会减少adults并退出。 否则他们增加leaving并阻塞。 当成人线程等待离开时,它被视为临界区的成人之一,因此额外的孩子可以进入。

 

 

相关文章:

  • 2021-11-07
  • 2021-08-01
  • 2021-10-24
  • 2022-01-18
  • 2022-01-18
  • 2021-10-22
  • 2021-06-17
  • 2021-09-10
猜你喜欢
  • 2021-10-25
  • 2022-01-01
  • 2021-07-06
  • 2021-11-10
  • 2021-04-12
  • 2021-07-19
  • 2021-11-09
相关资源
相似解决方案