序列的可能同步开始
Synchronization-possible start of the sequence
我对这些过程的输出很困惑。任何人都可以帮我找到序列的可能开始吗?
semaphore mutex = 1;
semaphore times_a = 2;
semaphore times_b = 0;
A:
repeat forever:
P(times_a)
P(mutex)
<A1>
V(mutex)
V(times_b)
B:
repeat forever:
P(times_b)
P(mutex)
<B1>
V(mutex)
V(times_a)
A和B并发执行产生
和 的无限序列。哪个
一个是序列唯一可能的开始:
- A1, A1, B1, A1, A1, B1, A1, A1, B1, ...
- A1, B1, A1, A1, B1, A1, B1, A1, A1, ...
- A1, B1, A1, B1, A1, B1, A1, B1, A1, ...
- A1, A1, B1, B1, A1, B1, B1, A1, A1, ...
答案应该是
3. A1, B1, A1, B1, A1, B1, A1, B1, A1, ...
为了更好地理解这个问题,我将突出显示这些要点。
- 只有 2 个线程(A 和 B)。
- 两者的过程永远重复。
当我们只看代码时,我们可以了解一些关于输出特征的事情,
- 第一个字母应该是A1。事实上,所有选项都说明了这一点。现在尝试更深入地挖掘以查找免责声明。如果你仔细看,你可以识别出以下内容。
- 在序列的任何一点,
(no of A1) > (no of B1)
。因为 运行 至少需要一个 专用 'A' 循环才能启动 'B' 循环。
- 在序列的任何一点,
(no of A1) ≤ (no of B1 + 2)
。因为在没有 'B' 周期支持的情况下,可以 运行 的最大 'A' 周期数是 2.
即(no of B1) < (no of A1) ≤ (no of B1 + 2)
从第一部分开始,您可以舍弃 (4)。
从第二部分开始,你可以舍弃(1)和(2)。
我想你能理解我的解释。如有问题请提出。 :))
我对这些过程的输出很困惑。任何人都可以帮我找到序列的可能开始吗?
semaphore mutex = 1;
semaphore times_a = 2;
semaphore times_b = 0;
A:
repeat forever:
P(times_a)
P(mutex)
<A1>
V(mutex)
V(times_b)
B:
repeat forever:
P(times_b)
P(mutex)
<B1>
V(mutex)
V(times_a)
A和B并发执行产生 和 的无限序列。哪个 一个是序列唯一可能的开始:
- A1, A1, B1, A1, A1, B1, A1, A1, B1, ...
- A1, B1, A1, A1, B1, A1, B1, A1, A1, ...
- A1, B1, A1, B1, A1, B1, A1, B1, A1, ...
- A1, A1, B1, B1, A1, B1, B1, A1, A1, ...
答案应该是
3. A1, B1, A1, B1, A1, B1, A1, B1, A1, ...
为了更好地理解这个问题,我将突出显示这些要点。
- 只有 2 个线程(A 和 B)。
- 两者的过程永远重复。
当我们只看代码时,我们可以了解一些关于输出特征的事情,
- 第一个字母应该是A1。事实上,所有选项都说明了这一点。现在尝试更深入地挖掘以查找免责声明。如果你仔细看,你可以识别出以下内容。
- 在序列的任何一点,
(no of A1) > (no of B1)
。因为 运行 至少需要一个 专用 'A' 循环才能启动 'B' 循环。 - 在序列的任何一点,
(no of A1) ≤ (no of B1 + 2)
。因为在没有 'B' 周期支持的情况下,可以 运行 的最大 'A' 周期数是 2.
即(no of B1) < (no of A1) ≤ (no of B1 + 2)
从第一部分开始,您可以舍弃 (4)。 从第二部分开始,你可以舍弃(1)和(2)。
我想你能理解我的解释。如有问题请提出。 :))