考虑下面的伪代码,其中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。
这个问题的测验