ネストされた「その後中止」の奇妙な動作

Piotr Walkusz

ネストされた「その後中止」構造は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(ループ内でアボートが発生する)、プログラムは正しく機能します。「abortthen」はライブラリ関数内にある可能性があるため、非常に危険だと思います。次に例を示します。

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;

このプログラムがこの奇妙な方法で動作する理由を誰かが説明できますか?

trashgod

Adaの制御機能の非同期転送とリアルタイム仕様の比較で述べたように、「非同期selectステートメントはネストされたATCを正しく処理します。たとえば、内部の遅延が保留中に外部のトリガーステートメントの遅延が期限切れになった場合、内部遅延はキャンセルされ、ATCは内部中止可能部分から公布されます…」

以下のバリエーションABBBBCは、予想どおりに印刷されます。外側のトリガーステートメントは、5秒のタイムアウトを指定します。ネストされたトリガーステートメントは、3秒のタイムアウトを指定します。後者の中止可能な部分は、その2番目のバジェットの1秒しか消費しないため、次の部分loopは、外側のタイムアウトの前に4つの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;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ネストされたForループでの奇妙な動作

分類Dev

C#LinqJSONネストされた配列の奇妙な動作

分類Dev

ネストされた配列操作の奇妙な動作、js

分類Dev

ネストされたTryCatchの奇妙な動作

分類Dev

Python。ネストされた辞書へのリスト:奇妙な動作

分類Dev

Pythonのネストされたリストを含む奇妙な動作

分類Dev

ネストされた変数を使用した奇妙なbashの動作

分類Dev

ネストされたヒアドキュメントの奇妙な動作

分類Dev

golangのネストされたスライス内の削除要素の奇妙な動作

分類Dev

テキストファイルの反復中にネストされたwhileループの奇妙な動作

分類Dev

バッチスクリプトでのネストされたラベルの奇妙な動作

分類Dev

ネストされたチェックボックスを使用した奇妙なng-modelの動作

分類Dev

Javascriptのネストされた配列には、奇妙な未定義の動作があります

分類Dev

ツールバーボタンとネストされたボタンを使用した奇妙なmatTooltipの動作

分類Dev

ネストされたCATransactionの動作?

分類Dev

ネストされたテーブルセルを使用する場合の奇妙な動作

分類Dev

コンポーネント内のネストされたディレクティブのChromeでの奇妙なAngularJS1.5の動作

分類Dev

ベクトルが変更された後のvector.back()への参照の奇妙な動作

分類Dev

奇妙なpjaxの動作:GETリクエストはpjaxリクエストの後に開始されます

分類Dev

3レベルのネストされたswfを使用したマウスオーバーでのgotoandplayの奇妙な動作

分類Dev

ネストされたジェネリッククラスをGSONで逆シリアル化するときの奇妙な動作

分類Dev

ネストされたCheckBoxGroupInputが奇妙に動作するReferenceInput

分類Dev

VirtualBox:ホストをOS XMavericksに更新した後の奇妙な動作

分類Dev

Firebaseツールをインストールした後の奇妙な動作

分類Dev

ブレースなしのネストされたif-else動作

分類Dev

CMD / CLIから呼び出されたときのPowershellスクリプトの奇妙な動作

分類Dev

Luaでのネストされた配列の動作

分類Dev

Hibernate:分離されたオブジェクトの更新-奇妙な動作

分類Dev

テンプレート化された演算子の奇妙な動作<<

Related 関連記事

  1. 1

    ネストされたForループでの奇妙な動作

  2. 2

    C#LinqJSONネストされた配列の奇妙な動作

  3. 3

    ネストされた配列操作の奇妙な動作、js

  4. 4

    ネストされたTryCatchの奇妙な動作

  5. 5

    Python。ネストされた辞書へのリスト:奇妙な動作

  6. 6

    Pythonのネストされたリストを含む奇妙な動作

  7. 7

    ネストされた変数を使用した奇妙なbashの動作

  8. 8

    ネストされたヒアドキュメントの奇妙な動作

  9. 9

    golangのネストされたスライス内の削除要素の奇妙な動作

  10. 10

    テキストファイルの反復中にネストされたwhileループの奇妙な動作

  11. 11

    バッチスクリプトでのネストされたラベルの奇妙な動作

  12. 12

    ネストされたチェックボックスを使用した奇妙なng-modelの動作

  13. 13

    Javascriptのネストされた配列には、奇妙な未定義の動作があります

  14. 14

    ツールバーボタンとネストされたボタンを使用した奇妙なmatTooltipの動作

  15. 15

    ネストされたCATransactionの動作?

  16. 16

    ネストされたテーブルセルを使用する場合の奇妙な動作

  17. 17

    コンポーネント内のネストされたディレクティブのChromeでの奇妙なAngularJS1.5の動作

  18. 18

    ベクトルが変更された後のvector.back()への参照の奇妙な動作

  19. 19

    奇妙なpjaxの動作:GETリクエストはpjaxリクエストの後に開始されます

  20. 20

    3レベルのネストされたswfを使用したマウスオーバーでのgotoandplayの奇妙な動作

  21. 21

    ネストされたジェネリッククラスをGSONで逆シリアル化するときの奇妙な動作

  22. 22

    ネストされたCheckBoxGroupInputが奇妙に動作するReferenceInput

  23. 23

    VirtualBox:ホストをOS XMavericksに更新した後の奇妙な動作

  24. 24

    Firebaseツールをインストールした後の奇妙な動作

  25. 25

    ブレースなしのネストされたif-else動作

  26. 26

    CMD / CLIから呼び出されたときのPowershellスクリプトの奇妙な動作

  27. 27

    Luaでのネストされた配列の動作

  28. 28

    Hibernate:分離されたオブジェクトの更新-奇妙な動作

  29. 29

    テンプレート化された演算子の奇妙な動作<<

ホットタグ

アーカイブ