考虑下面的多线程代码段(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很好地同步
这个问题的测验