信号量 makeWater() 同步

Semaphores makeWater() synchronization

该程序声称可以解决 makeWater() 同步问题。但是,我无法理解如何。我是信号量的新手。如果您能帮助我理解这段代码,我将不胜感激。

因此,您需要同时从多个 运行 H 线程和 O 线程中创建 H2O(2Hs 和一个 O)组合。

事情是一个 'O' 需要两个 'H' 。并且两个不同的水分子之间没有共享。

因此假设有多个 O 和 H 线程启动它们的进程。

  • 没有 O 线程可以超出 P(o_wait) 因为 o-wait 被锁定,应该等待。
  • 一个随机的幸运 H 线程(比如 H*-1)可以通过 P(mutex)(现在 mutex = 0 和 count = 1)并且将进入 if(count%2 == 1),然后向上计数'mutex'(现在 mutex = 1)并在 P(h_wait) 中阻塞。 (这个计数其实是指H计数)
  • 因为 'mutex' 被向上计数,另一个随机 H 线程 (H*-2) 将开始通过 P(mutex)(现在互斥量 = 0 且计数 =2)。但现在计数是偶数 -> 因此它进入 else。然后它将 V(o_wait)(现在 o_wait = 1)并卡在 P(h_wait).
  • 现在 H*-1 仍然在 if 块内的先前位置。但是因为 o_wait 向上计数为 1,幸运的 O 线程 (O*) 可以继续其过程。它将执行两个 V(h_wait) s(现在 o_wait = 0,h_wait = 2),以便 2 个先前的 H 线程可以继续(没有任何其他,现在 h_wait = 0 ).所以所有 3(2 个 Hs 和 O)都可以完成它的过程,而 H*-2 正在向上计数 'mutex'(现在 mutex = 1)。
  • 现在全局变量完成一分子后的最终值,mutex = 1,h_wait = 0 和 o_wait = 0,所以刚好是初始状态。现在前面的过程会一次又一次地发生,因此会产生H2O分子。

我想你已经明白了。如有问题请提出。 :))