任务中的意外输出?

时间:2015-01-20 16:42:36

标签: task ada

为什么以下代码不确定task_1应该先执行task_2,因为处于等待状态的task_1从main获取第一个启动消息?但输出是不可预测的,请帮助我理解?

 WITH Ada.Text_IO;                  --  Include Text_IO Library
 WITH Ada.Integer_Text_IO;    --  Include Integer Text_IO Library
 PROCEDURE task_demo_02 IS
TASK TYPE intro_task (message1 : Integer) IS  
      ENTRY start;             --  Entry Point Into The Task
  END intro_task;

  TASK BODY intro_task IS       --  Task Body Definition
BEGIN
 ada.text_io.put_line("waitng");
   ACCEPT start;            --  Entry Point Into The Task
   Ada.Text_IO.put ( "Display from Task ");
   Ada.Integer_Text_IO.put (message1,  1);
   Ada.Text_IO.new_line;
   END intro_task;
  Task_1 : intro_task (message1 => 1);--activate
  Task_2 : intro_task (message1 => 2);--activate

   BEGIN
   ada.Text_IO.put_line("main");
   Task_1.start;  --- first task_1 should execute
   Task_2.start;   --- then task_2 isn't it ?
   END task_demo_02;

1 个答案:

答案 0 :(得分:3)

BEGIN
   ada.Text_IO.put_line("main");
   Task_1.start;  --- first task_1 should execute

您的评论似乎假设这将导致Task_1执行,Task_1将完成执行,直到完成,然后主程序将继续Task_2.start

但事实并非如此。 Task_1.start表示Task_1现在已准备好执行。但此时,有两个任务准备好执行:Task_1环境任务,这是运行task_demo_2的任务。您无法确定首先运行哪个任务(有一些调度策略将指定在这种情况下如何运行任务,但一般情况下您无法分辨)。这意味着task_demo_02可以继续运行,这意味着Task_2.start将在Task_1继续之前发生。或者它可能意味着Task_1启动,但处理器将在Task_1task_demo_02之间分配时间。或者,在多处理器系统上,它们可以并行运行。

如果你想编写一个程序,其中主程序启动Task_1并等待它完成,最可靠的方法是添加另一个条目:

TASK TYPE intro_task (message1 : Integer) IS  
    entry Start;
    entry Finish;
END intro_task;

Task_1.Start;
Task_1.Finish;

然后,在intro_task的末尾添加

accept Finish;