将测试集指令定义为:
function TestAndSet (var x: boolean): boolean;
begin
TestAndSet = x;
x = true
end;
有可能解决用餐哲学家的问题吗?是的,我知道我们可以使用信号灯或监视器来解决它。
答案 0 :(得分:0)
当然,原子 TestAndSet
足以进行互斥锁。 TestAndSet(fork)
是尝试执行的锁定,如果成功,它将返回false
。 fork=false
将其解锁。
您可以使用Dijkstra的解决方案-每个哲学家都首先锁定最北端的叉子。
答案 1 :(得分:0)
是的
举一个例子;带有原子TestAndSet
指令和原子clear
指令;可以公平地提名“控制哲学家”;被提名的控制哲学家在这里检查他们的两个叉子是否都是自由的,并决定他们是否可以/不能吃饭,然后释放控制权。
例如:
while(running) {
if(testAndSet(controllerFlag) == TRUE) {
if(nextController == ME) {
if(bothForksAreFree()) {
myNextState = EATING;
markBothForksInUse(ME);
} else {
myNextState = WAITING;
}
nextController = nextController + 1;
if(nextController > MAX_CONTROLLERS) {
nextController = 0;
}
}
clear(controllerFlag);
if(myNextState == EATING) {
eat();
markBothForksFree(ME);
think();
}
}
}
用于数据;这涉及为每个哲学家分配一个唯一且连续的数字(例如0到N),controllerFlag
,以及代表每个叉子状态的标志(使用中,免费)。 markBothForksFree()
可能需要使用“原子清除”指令,但其他所有内容均受controllerFlag
保护。