我正在读考试并且很难理解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的来电者可以饿死吗?
我真的很感激任何帮助。提前谢谢。
答案 0 :(得分:6)
答案 1 :(得分:3)
按照问题的逻辑而不是语法,我认为答案是'这完全取决于'。
正在运行此循环的任务(称为Server
)处于繁忙循环中(大多数情况下循环循环,它最终会设置A := True; B := True;
)。这可能会占用你所有的CPU,并将其他任务排除在外。
假设没有发生,并且您有2个客户端任务A_Caller
和B_Caller
,其优先级高于Server
并且相对不频繁地调用他们的条目,那么您可能会得到
A_Caller
和B_Caller
都会运行并调用各自的条目。Server
进入select
并找到两个警卫打开并调用条目;它选择接受A
(它本可以选择B
)。警卫B
已关闭。A
已打开,但没有来电;警卫B
已关闭;已选择else
部分,因此会打开警卫B
。Server
接受B
;警卫A
已关闭。B
已打开,但没有来电;已选择else
部分,因此会打开警卫A
。else
部分再次被选中而我们旋转。显然,所遵循的确切顺序将取决于条目调用何时到达Server
的循环。假设您的问题中的条目调用相隔一秒,则将按照所谓的顺序接受条目。
除非其中一个调用者频繁运行,否则在Server
回到其循环之前再次调用它的条目时,我认为你不会饿死。在通用操作系统下很难实现这一点。
答案 2 :(得分:2)
这看起来不像ada语法,也许您可以使用ada代码重新发布? 与此同时,我推荐您:http://en.wikibooks.org/wiki/Ada_Programming/Tasking#Rendezvous