信号量makeWater()同步

Blu*_*Blu 3 concurrency multithreading synchronization mutex semaphore

MakeWater()同步伪代码

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

Sup*_*hne 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分子.

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