信号量makeWater()同步

时间:2016-09-23 15:53:30

标签: multithreading concurrency synchronization mutex semaphore

MakeWater() synchronization pseudocode

该程序声称解决了makeWater()同步问题。但是,我无法理解。我是信号量的新手。如果你能帮助我理解这段代码,我会很高兴。

1 个答案:

答案 0 :(得分:6)

因此,您需要在多个同时运行的H线程和O线程中生成H2O(2Hs和一个O)组合。

事情是'O'需要两个'H'。两种不同的水分子之间没有任何形状。

因此假设O和H线程的数量开始其进程。

  • 没有O线程可以超越P(o_wait),因为o-wait被锁定,应该等待。
  • 一个随机的幸运H线程(比如H * -1)可以通过P(mutex)(现在互斥= 0和计数= 1)并且将进入if(count%2 == 1),然后进入向上计数'互斥'(现在是互斥= 1)并在P(h_wait)中阻止。 (此计数实际上是指H计数)
  • 因为'互斥'被计数,另一个随机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 H和O)都可以完成它的过程,而H * -2正在计算'互斥'(现在互斥= 1)。
  • 现在完成一个分子后的全局变量的最终值,mutex = 1,h_wait = 0和o_wait = 0,所以恰好是初始状态。现在,前一个过程将一次又一次地发生,因此将产生H2O分子。

我想你明白了。请提出问题。 :))