Избегайте ожидания завершения вызванной задачи
У меня есть вопрос о задаче в Аде. Я пытаюсь сделать сервер в Аде, который будет обслуживать несколько клиентов одновременно (используя 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