Ada停止执行并执行其他条目

时间:2018-03-20 13:27:43

标签: ada

我是Ada的新手,我正在尝试编写一个简单的程序,但我遇到了一些我无法解决的问题。所以我有一个执行条目和一个signalfound条目的任务,首先调用执行条目,并且必须进行一些计算,直到主信号调用signalfound条目然后它必须停止。

但问题是,当调用Signalfound条目时,它不会被执行,因为任务停留在while循环中。在Ada中是否有明显的解决方案。我试过谷歌搜索问题,但没有成功。提前谢谢!

task Example body
  ResultFound : Boolean := False;
  --- other unimportant things
begin
  loop
    select
       accept Execute do
         while (ResultFound = False) loop
             ---do some calculations
         end loop;
       end Execute;
    or
       accept SignalFound do
         ResultFound := True;
       end SignalFound;
    or
       -- other unimportant accepts
    end select;
  end loop;
end Example;          

1 个答案:

答案 0 :(得分:3)

好吧,当调用Execute时,您的任务进入循环,这意味着它再也不会执行 select 语句,因此它永远不会接受{{1调用。此外,调用SignalFound的实体永远不会继续,因为您的while循环会在 Execute 语句中 。通常,您希望尽可能减小任务同步的关键区域,以便在交换必要的数据后,这两个任务都可以继续工作。

请注意,您的代码反映了您的任务运行的协议。目前,您的代码显示“我将在任何循环迭代”接受acceptExecute,这似乎与您根据什么考虑的协议不符你写的。

我相信你真正想做的事情是这样的:

SignalFound

此代码强制执行一系列交替的task Example body begin loop -- simply wait for someone to tell me to execute. accept Execute; Calculations : loop -- check at every loop iteration whether there's a SignalFound waiting select accept SignalFound; exit Calculations; else -- do some calculations end select; end loop Calculations; -- will go to next iteration and wait for someone to call Execute again. end loop; end Example; / Execute调用,这似乎是您的想法。