第五章 稍欠经典的同步问题

 

5.1 野蛮人进餐问题

 

这个问题来自安德鲁斯的并发编程[1]。

一个野蛮人部落从一个大锅里吃公共晚餐,大锅可以容纳大量的炖传教士。【这个问题是基于对狩猎 - 采集社会中西方传教士历史的卡通化表现。 一些幽默的意图是针对哲学家进餐的问题,但这里的“野蛮人”的表现并不是为了比以前的哲学家的表现更为现实。 如果你对狩猎 - 采集社会感兴趣,我推荐Jared Diamond的《Guns, Germs and Steel》,Napoleon Chagnon的《The Yanomamo》,以及Redmond O'Hanlon的《In Trouble Again》,但不推荐Tierney的《Darkness in El Dorado》,我认为这是不可信的。】当一个野蛮人想吃东西时,他会帮助自己从锅中解脱,除非它是空的。 如果锅是空的,野蛮人将厨师吵醒,然后等到厨师重新装满锅。

任意数量的野蛮人线程都运行以下代码:

The Little Book of Semaphores 信号量小书 第五章 稍欠经典的同步问题 5.1 野蛮人进餐问题

一个厨师线程运行此代码:

The Little Book of Semaphores 信号量小书 第五章 稍欠经典的同步问题 5.1 野蛮人进餐问题

同步约束是:

  • 如果锅底为空,野蛮人无法调用getServingFromPot。
  • 只有在锅为空时,厨师才能调用putServingsInPot。

思考:为野蛮人和厨师添加满足同步约束的代码。

 

5.1.1 野蛮人进餐问题提示

很容易使用信号量来跟踪食物的数量,就像生产者 - 消费者问题一样。 但是为了在锅为空时向厨师发出信号,线程必须在递减信号量之前知道它是否必须等待,而我们就是不能这样做。

另一种方法是使用记分板来跟踪食物的数量。 如果一个野蛮人发现计数器为零,他会唤醒厨师并等待锅已满的信号。 以下是我使用的变量:

The Little Book of Semaphores 信号量小书 第五章 稍欠经典的同步问题 5.1 野蛮人进餐问题

毫不奇怪,emptyPot表示锅是空的,而fullPot表示锅已满。

 

5.1.1 野蛮人进餐问题方案

我的解决方案是记分牌模式与集合点的组合。 这是厨师的代码:

The Little Book of Semaphores 信号量小书 第五章 稍欠经典的同步问题 5.1 野蛮人进餐问题

野蛮人的代码只是稍微复杂一点。 当每个野蛮人通过互斥体时,他会检查锅。 如果它是空的,他会向厨师发出信号并等待。 否则,他减少了servings并从锅中获得了一份食物。

The Little Book of Semaphores 信号量小书 第五章 稍欠经典的同步问题 5.1 野蛮人进餐问题

 

 

 

 

 

 

未完待续。。。

相关文章:

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