任务中的意外输出?
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_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;
为什么下面的代码不确定 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_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;