在进入操作系统的临界区之前处理多个等待操作?

Handling Multiple wait operation before entering into critical section in operating system?

我在解决操作系统主题中的计数信号量问题时卡住了。

S is a semaphore initialized to 5.

count = 0 (shared variable) 

Assume that the increment operation in line #7 is not atomic.

现在,

1.  int counter = 0;
2.  Semaphore S = init(5);
3.  void parop(void)
4.  {
5.         wait(S);
6.         wait(S);
7.         counter++;
8.         signal(S);
9.         signal(S);
10.  }

如果五个线程并发执行函数parop,下面哪个程序行为is/are可能?

A.所有线程成功执行完parop后counter的值为5

B.所有线程成功执行完parop后counter的值为1

C.所有线程成功执行完parop后counter的值为0

D.所有线程都死锁了

到目前为止我的理解是答案是 A 和 D,因为如果所有过程都一一执行怎么办(T1->T2->T3->T4 ->T5) 最终保存的值为 5(所以 A 是正确的选项之一) 现在,为什么是 D,因为如果所有进程在第 6 行之前执行第 5 行并且会被阻塞怎么办。

现在,请任何人帮助我理解为什么 B 是另一个正确答案。 ?

提前致谢,

希望你尽快来这里

任何帮助将不胜感激。

假设 thread 1 在任何其他线程之前到达第 7 行,并且第 7 行被实现为三个指令:

7_1:  load counter, %r0
7_2:  add  , %r0
7_3:  store %r0, counter

由于某种原因(例如中断、被抢占),thread 1 在指令 7_2 处停止;所以它将值 0 加载到寄存器 %r0.

接下来,thread's 2..5 所有 运行 通过这个序列,将计数器留在说 4

Thread 1 被重新安排,将 %r0 递增到值 1 并将其存储到 counter.