信号量 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分子。
我想你已经明白了。如有问题请提出。 :))
该程序声称可以解决 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分子。
我想你已经明白了。如有问题请提出。 :))