📜  门| GATE CS 2021 |设置 1 |第 56 题

📅  最后修改于: 2021-09-26 03:15:40             🧑  作者: Mango

考虑以下伪代码,其中 S 是在第 2 行中初始化为 5 的信号量,而 counter 是在第 1 行中初始化为 0 的共享变量。假设第 7 行中的增量操作不是原子的。

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函数,以下哪些程序行为是可能的?
(A)所有线程成功完成parop执行后counter的值为5
(B)所有线程成功完成parop执行后counter的值为1
(C)所有线程成功执行parop后counter的值为0
(D)存在涉及所有线程的死锁答案: (A) (B) (D)
说明:首先,由于counter的值为5,如果每个线程有两个wait()和两个signal()。因此,如果这些线程完成时,最终计数器值永远不会为 0。
因此,选项(C)是错误的。

如果线程以任何顺序运行,即一个接一个地运行,则计数器值 5 是可能的。
所以,选项(A)是正确的。

如果首先进入并读取计数器 = 0 并在执行所有其他线程后写入计数器值 5 的线程,则计数器值 1 也是可能的。
所以,选项(B)是正确的。

仅执行第一个 wait(S) 后五个线程被抢占;第 5 行。
现在,第二次等待(S);第 6 行,会导致死锁。
所以,选项(D)是正确的。
这个问题的测验