避免等待被调用的任务完成

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