所以您需要从同时运行的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分子。
我认为您已经清楚了。如有任何疑问,请提出。 :))