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

Ada停止条目执行并执行其他条目,ada,Ada,我是Ada的新手,我正在尝试编写一个简单的程序,但我有一些问题无法解决。我有一个任务,有一个execute条目和一个signalfound条目,execute条目首先被调用,并且必须进行一些计算,直到signalfound条目被main调用,然后它必须停止 但问题是,当调用Signalfound条目时,它不会被执行,因为任务卡在while循环中。Ada中是否有一个明显的解决方案。我试着用谷歌搜索这个问题,但没有成功。提前谢谢 task Example body ResultFound : B

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

但问题是,当调用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;          

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

请注意,您的代码反映了任务运行所依据的协议。目前,您的代码表示“我将在任何循环迭代中同时接受
Execute
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
/
SignalFound
调用,这似乎就是您的想法。

退出计算;