📜  门| GATE CS 2021 |设置 2 |第 52 题

📅  最后修改于: 2021-09-25 05:00:03             🧑  作者: 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) False,不必总是为真。

(2) True, 执行顺序:P1->T1->T2; P2->T1->T2; P1-print(x), P2-print(x) |输出为 4,4

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

(4) True, y=y+1 可以当作临界区,通过Acquire L1和Release L1很好的同步
这个问题的测验