约会如何运作?

时间:2011-01-26 07:47:14

标签: ada

我正在读考试并且很难理解Rendezvous。 这是一个我正在寻找的例子

While(1) {
 select{
  when a == TRUE :
   accept A() {f1; b=FALSE}
  when b == TRUE :
   accept B() {f2; a=FALSE}
  else {a=true; b=true}
 }
}

以下来电按既定顺序到达: A(),B(),B(),A(),A(),B()

接听电话的顺序是什么?并且A或B的来电者可以饿死吗?

我真的很感激任何帮助。提前谢谢。

3 个答案:

答案 0 :(得分:6)

那不是阿达。完全没有。

有关使用实际Ada进行任务分配的一些指导,请阅读Ada Distilled的第14章。

说实话,如果你不认识你的例子不是阿达,你可能应该从第1章开始。

答案 1 :(得分:3)

按照问题的逻辑而不是语法,我认为答案是'这完全取决于'。

正在运行此循环的任务(称为Server)处于繁忙循环中(大多数情况下循环循环,它最终会设置A := True; B := True;)。这可能会占用你所有的CPU,并将其他任务排除在外。

假设没有发生,并且您有2个客户端任务A_CallerB_Caller,其优先级高于Server并且相对不频繁地调用他们的条目,那么您可能会得到

  1. A_CallerB_Caller都会运行并调用各自的条目。
  2. Server进入select并找到两个警卫打开并调用条目;它选择接受A(它本可以选择B)。警卫B已关闭。
  3. 下一次循环,后卫A已打开,但没有来电;警卫B已关闭;已选择else部分,因此会打开警卫B
  4. 下次循环播放时,Server接受B;警卫A已关闭。
  5. 下一次循环,后卫B已打开,但没有来电;已选择else部分,因此会打开警卫A
  6. 下一次围绕循环,两个守卫都是打开但没有来电者,所以else部分再次被选中而我们旋转。
  7. 显然,所遵循的确切顺序将取决于条目调用何时到达Server的循环。假设您的问题中的条目调用相隔一秒,则将按照所谓的顺序接受条目。

    除非其中一个调用者频繁运行,否则在Server回到其循环之前再次调用它的条目时,我认为你不会饿死。在通用操作系统下很难实现这一点。

答案 2 :(得分:2)

这看起来不像ada语法,也许您可​​以使用ada代码重新发布? 与此同时,我推荐您:http://en.wikibooks.org/wiki/Ada_Programming/Tasking#Rendezvous