在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;
有人能解釋爲什麼這個節目在這個奇怪的方式表現?