2017-10-11 77 views
1

在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)。它看起來代碼這樣的行爲:

  1. 執行Put_Line("A")和等待2秒鐘內
  2. 退出「然後中止」
  3. 執行循環忽略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; 

有人能解釋爲什麼這個節目在這個奇怪的方式表現?

回答

2

A Comparison of the Asynchronous Transfer of Control Features in Ada and the Real-Time Specification所述,「異步選擇語句正確處理嵌套的ATC,例如,如果外部觸發語句的延遲在內部延遲未決時到期,則內部延遲將被取消,並且ATC將會頒佈出內部不可饒恕的部分...「

下面的變化按預期打印ABBBBC。觸發語句的外部指定了5秒的超時時間;嵌套的觸發語句指定三秒超時。由於後者的可中止部分僅消耗其第二個預算的一秒,隨後的loop可以在外部超時之前打印四個B。將外部delay更改爲1.0以重現您的示例中看到的效果。

with Ada.Text_IO; use Ada.Text_IO; 

procedure Main is 

    task TestTask; 

    task body TestTask is 
    begin 
     select 
     delay 5.0; 
     Put("C"); 
     then abort 
     select 
      delay 3.0; 
     then abort 
      Put("A"); 
      delay 1.0; 
     end select; 
     loop 
      Put("B"); 
      delay 1.0; 
     end loop; 
     end select; 
    end TestTask; 

begin 
    null; 
end Main;