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

📅  最后修改于: 2021-06-28 23:47:46             🧑  作者: 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)为true。

如果在执行所有其他线程后首先进入并读取计数器= 0并在结束时写入计数器值5的线程,则也可以使用计数器值1。
因此,选项(B)为true。

仅执行第一次等待(S)后,五个线程被抢占;第5行。
现在,第二次等待;第6行,将导致死锁。
因此,选项(D)为true。
这个问题的测验