在Ada中嵌套“然后中止”结构合法吗?如果是,我可以如何正确使用它们?我有这样的代码:嵌套“然后中止”怪异行为
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
task TestTask is
end TestTask;
task body TestTask is
begin
select
delay 2.0;
Put_Line("C"); -- never executed
then abort
select
delay 5.0;
then abort
Put_Line("A");
delay 4.0;
end select;
loop
Put_Line("B");
delay 10.0;
end loop;
end select;
end TestTask;
begin
null;
end Main;
我希望这段代码应该在2秒后退出。但相反,它连续打印“B”而没有延迟(它忽略了delay 10.0
)。它看起来代码这样的行为:
- 执行
Put_Line("A")
和等待2秒钟内 - 退出“然后中止”
- 执行循环忽略
delay 10.0
如果不是delay 4.0
我们插入delay 1.0
(然后在循环内发生中止),程序正常工作。我认为这是非常危险的,因为“放弃那么”可库函数里面,例如:
procedure Main is
----- It's function from library -----
procedure Foo is
begin
select
delay 5.0;
then abort
Put_Line("A");
delay 4.0;
end select;
end;
---------------------------------------
task TestTask is
end TestTask;
task body TestTask is
begin
select
delay 2.0;
Put_Line("C"); -- never executed
then abort
Foo;
loop
Put_Line("B");
delay 10.0;
end loop;
end select;
end TestTask;
begin
null;
end Main;
有人能解释为什么这个节目在这个奇怪的方式表现?