用测试集指导来解决哲学家的问题

时间:2019-05-15 02:01:23

标签: c operating-system pseudocode

将测试集指令定义为:

  function TestAndSet (var x: boolean): boolean;
  begin
    TestAndSet = x;
    x = true
  end;

有可能解决用餐哲学家的问题吗?是的,我知道我们可以使用信号灯或监视器来解决它。

2 个答案:

答案 0 :(得分:0)

当然,原子 TestAndSet足以进行互斥锁。 TestAndSet(fork)是尝试执行的锁定,如果成功,它将返回falsefork=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保护。