Избегайте ожидания завершения вызванной задачи

У меня есть вопрос о задаче в Аде. Я пытаюсь сделать сервер в Аде, который будет обслуживать несколько клиентов одновременно (используя GNAT.Sockets).

Можно ли динамически создать задачу (с передачей аргумента) и не ждать, пока эта задача будет завершена? Должен ли я использовать внешние библиотеки? Я действительно застрял. Спасибо за вашу помощь.

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
Другие вопросы по тегам