避免等待被调用的任务完成
Avoid waiting for the called task to complete
我有一个关于在 Ada 中分配任务的问题。我正在尝试在 Ada 中做一个服务器,它可以同时为多个客户端提供服务(使用 GNAT.Sockets
)。
是否可以动态创建任务(通过传递参数)而不是等到任务完成?我必须使用外部库吗?我真的卡住了。感谢您的帮助。
关键在于你的问题,“是否可以动态创建任务[...]”。
如果您创建任务 type,您可以使用 new
创建该类型的实例,它们将在分配完成后立即启动 运行完成。
至少有两种传递参数的方式。您可以限制任务类型(下例中的 A
),也可以将值传递给 Start
条目(下例中的 B
)。如果无论如何你都需要一个 Start
条目(以确保任务在你准备好之前不会真正开始),或者如果参数是不能作为约束的东西(例如,记录),那就是可能是要走的路:否则没有太多选择。
with Ada.Text_IO; use Ada.Text_IO;
procedure Unnamed454 is
task type A (Param : Integer) is
end A;
type A_P is access A;
task body A is
begin
Put_Line ("task A running with Param:" & Integer'Image (Param));
delay 2.0;
Put_Line ("exiting task A");
end A;
task type B is
entry Start (Param : Integer);
end B;
type B_P is access B;
task body B is
Param : Integer := 0;
begin
accept Start (Param : Integer) do
B.Param := Param;
end Start;
Put_Line ("task B running with Param:" & Integer'Image (Param));
delay 4.0;
Put_Line ("exiting task B");
end B;
begin
Create_A:
declare
The_A : A_P := new A (42);
begin
Put_Line ("in Create_A block");
end Create_A;
Create_B:
declare
The_B : B_P := new B;
begin
Put_Line ("in Create_B block");
The_B.Start (79);
Put_Line ("exiting Create_B block");
end Create_B;
Put_Line ("exiting main");
end Unnamed454;
结果
task A running with Param: 42
in Create_A block
in Create_B block
task B running with Param: 79
exiting Create_B block
exiting main
2秒后
exiting task A
然后又过了2秒
exiting task B
我有一个关于在 Ada 中分配任务的问题。我正在尝试在 Ada 中做一个服务器,它可以同时为多个客户端提供服务(使用 GNAT.Sockets
)。
是否可以动态创建任务(通过传递参数)而不是等到任务完成?我必须使用外部库吗?我真的卡住了。感谢您的帮助。
关键在于你的问题,“是否可以动态创建任务[...]”。
如果您创建任务 type,您可以使用 new
创建该类型的实例,它们将在分配完成后立即启动 运行完成。
至少有两种传递参数的方式。您可以限制任务类型(下例中的 A
),也可以将值传递给 Start
条目(下例中的 B
)。如果无论如何你都需要一个 Start
条目(以确保任务在你准备好之前不会真正开始),或者如果参数是不能作为约束的东西(例如,记录),那就是可能是要走的路:否则没有太多选择。
with Ada.Text_IO; use Ada.Text_IO;
procedure Unnamed454 is
task type A (Param : Integer) is
end A;
type A_P is access A;
task body A is
begin
Put_Line ("task A running with Param:" & Integer'Image (Param));
delay 2.0;
Put_Line ("exiting task A");
end A;
task type B is
entry Start (Param : Integer);
end B;
type B_P is access B;
task body B is
Param : Integer := 0;
begin
accept Start (Param : Integer) do
B.Param := Param;
end Start;
Put_Line ("task B running with Param:" & Integer'Image (Param));
delay 4.0;
Put_Line ("exiting task B");
end B;
begin
Create_A:
declare
The_A : A_P := new A (42);
begin
Put_Line ("in Create_A block");
end Create_A;
Create_B:
declare
The_B : B_P := new B;
begin
Put_Line ("in Create_B block");
The_B.Start (79);
Put_Line ("exiting Create_B block");
end Create_B;
Put_Line ("exiting main");
end Unnamed454;
结果
task A running with Param: 42
in Create_A block
in Create_B block
task B running with Param: 79
exiting Create_B block
exiting main
2秒后
exiting task A
然后又过了2秒
exiting task B