Silberschatz、Galvin 和 Gagne 所著的《操作系统原理》一书对 test_and_set 的原子操作有以下实现
boolean test_and_set(boolean *target) {
boolean rv = *target;
*target = true;
return rv;
}
他们声明了一个初始化为 0 的全局变量锁,并为每个进程使用了以下互斥锁实现
do {
while(test_and_set(&lock))
; // do nothing
// critical section
lock = false;
// remainder section
} while(true);
现在,让我们考虑一下进程 P0 正在执行临界区而进程 P1 卡在 while 循环中的情况。然后考虑以下执行顺序
//lock = true initially because P0 is in critical section
P1 boolean rv = *target; //rv = true, lock = true
//P0 now completed its critical section and is ready to leave the lock
P0 lock = false //rv = true, lock = false
P1 *target = true; //rv = true, lock = true
P1 return rv; // returns true
因此,进程 P0 或任何其他进程实际上不能永远进入临界区。那么这将如何处理这种情况呢?