📜  门| GATE CS 2021 |套装2 |第52章

📅  最后修改于: 2021-07-02 14:49:46             🧑  作者: Mango

考虑下面的多线程代码段(C和伪代码的混合),由两个进程P1和P2调用,每个进程产生两个线程T1和T2:

int x = 0;  // global
Lock L1;    // global
main () { 
    create a thread to execute foo( ); // Thread T1
    create a thread to execute foo( ); // Thread T2
    wait for the two threads to finish execution;
    print(x);}
    
    
foo() {
    int y = 0;
    Acquire L1;
    x = x + 1;
    y = y + 1;
    Release L1;
    print (y);} 

下列哪个陈述是正确的?
(A) P1和P2都将x的值打印为2。
(B)至少P1和P2将x的值打印为4。
(C)至少有一个线程会将y的值打印为2。
(D)在这两个过程中,T1和T2都将y的值打印为1。答案: (A) (D)
说明: (1)错误,不必始终为true。

(2)是,执行顺序:P1-> T1-> T2; P2-> T1-> T2; P1打印(x),P2打印(x)|输出是4,4

(3)错误,线程维护自己的堆栈副本,并且局部变量(y)存储在堆栈中。

(4)是的,y = y + 1可以视为关键部分,并且可以通过Acquire L1和Release L1很好地同步
这个问题的测验