同步 - 可能启动序列

时间:2016-09-23 13:29:17

标签: multithreading concurrency synchronization thread-safety semaphore

我对这些过程的输出感到非常困惑。任何人都可以帮我找到序列的可能开始吗?

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. A1,A1,B1,A1,A1,B1,A1,A1,B1,......
  2. A1,B1,A1,A1,B1,A1,B1,A1,A1,......
  3. A1,B1,A1,B1,A1,B1,A1,B1,A1,......
  4. A1,A1,B1,B1,A1,B1,B1,A1,A1,......

1 个答案:

答案 0 :(得分:1)

答案应该是

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)。

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