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