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