为什么以下代码不确定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;
答案 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_1
和task_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;