序列的可能同步开始

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并发执行产生 和 的无限序列。哪个 一个是序列唯一可能的开始:

  1. A​​1, A1, B1, A1, A1, B1, A1, A1, B1, ...
  2. A​​1, B1, A1, A1, B1, A1, B1, A1, A1, ...
  3. A​​1, B1, A1, B1, A1, B1, A1, B1, A1, ...
  4. A​​1, 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)。

我想你能理解我的解释。如有问题请提出。 :))