信号量实现 makeWater() 的同步。

4
该程序声称解决了makeWater()同步问题,但我不明白如何解决。我对信号量很陌生。如果您能帮助我理解这段代码,我将不胜感激。

MakeWater()同步伪代码

1个回答

7
所以您需要从同时运行的H线程和O线程中制造出H2O(2H和1O)组合。问题在于一个“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)(现在mutex = 0,count = 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和1个O)都可以完成其过程,而H * -2正在提高'mutex'(现在mutex = 1)。 - 现在,在完成一个分子后,全局变量的最终值是:mutex = 1,h_wait = 0和o_wait = 0,因此初始状态完全相同。现在以前的进程将一遍又一遍地发生,因此将创建H2O分子。
我认为您已经清楚了。如有任何疑问,请提出。 :))

这是一个很好的解释 =) 我非常理解!非常感谢 Supun @Supun Wijerathne - Blu
@Blu 很高兴见到(Y) :)) - Supun Wijerathne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接