第 45 题
现要求学生使用 swap 指令和布尔型变量 lock 实现临界区互斥。lock 为线程间共享的变量。lock 的值为 TRUE 时线程不能进入临界区,为 FALSE 时线程能够进入临界区。某同学编写的实现临界区互斥的伪代码如题 45(a) 图所示。
(1) 题 45(a) 图中伪代码中哪些语句存在错误?将其改为正确的语句(不增加语句条数)。
(2) 题 45(b) 图中给出了两个变量值的函数 newSwap() 的代码是否可以用函数调用语句“newSwap(&key, &lock)”代替指令“swap key, lock”以实现临界区的互斥?为什么?
[tag_link]
1)进入区中的语句 if (key == TRUE) swap key,lock 存在错误,修改为 while (key ==TRUE) swap key, lock。退出区中的语句 lock=TRUE 存在错误,修改为 lock=FALSE。
2)否。因为多个线程可以并发执行 newSwap(),newSwap() 执行时传递给形参 b 的是共享变量 lock 的地址,在 newSwap() 中对 lock 既有读操作又有写操作,并发执行时不能保证实现两个变量值的原子交换,从而会导致并发执行的线程同时进入临界区。