避免等待被叫任务完成

时间:2015-01-06 18:02:18

标签: multithreading task ada

我在阿达有一个关于任务的问题。我想在Ada中做一个服务器,一次为多个客户端服务(使用GNAT.Sockets)。

是否可以动态创建任务(传递参数)而不是等到此任务完成?我必须使用外部库吗?我真的卡住了。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

关键在于您的问题,"是否可以动态创建任务[...]“。

如果创建任务类型,则可以使用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