Silberschatz、Galvin 和 Gagne 所著的《操作系统原理》一书在有关同步的章节中包含 TestAndSet() 指令的以下定义:
boolean TestAndSet(boolean *target) {
boolean rv = *target;
*target = TRUE;
return rv;
}
还提供了使用上述指令的互斥实现如下:
do {
while(TestAndSetLock(&lock))
; // do nothing
// critical section
lock = FALSE;
// remainder section
} while(TRUE);
现在,如果没有将target设置为TRUE的条件,如何实现互斥呢?
考虑以下情况,进程 P0 将共享变量锁设置为 TRUE 并进入其临界区。另一个进程 P1 在上面的 while 循环中调用 TestAndSet(),它返回 TRUE(因为 P0 有锁),同时无条件地将锁设置为 FALSE。在 while 循环中第二次调用 TestAndSet() 时,它将返回 FALSE 并且 P1 进入其临界区,即使 P0 处于其临界区。然后违反了互斥。
我进行了一些搜索,偶然发现了 Mithun Acharya 和 Robert Funderlic(北卡罗来纳州立大学计算机科学系)的一篇论文,其中包含 TestAndSet() 的以下替代定义:
boolean Test-and-Set(boolean target)
begin
if(target == false):
target = true;
return target;
end
这对我来说更有意义,我将其包括在内以进行比较,还因为该论文将 Silberschatz 的书列为参考文献之一。
我只是不明白我在教科书中找到的定义(我首先提供的那个)如何用于实现互斥,有人可以帮忙吗?