任务中的意外输出?

Unexpected output in Tasking?

为什么下面的代码不确定 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;
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 可以保持 运行ning,这意味着 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;