我们可以不以同步方式运行池中的每个任务吗?

LaT*_*ast 2 concurrency ada

我是Ada的新手。

我已经声明了新的任务类型,并将其中三个存储在一个池中。然后,我想循环运行每个任务。

预期的行为是所有它们都同时执行。

现实情况是,它们是一个接一个地执行的。因此,任务(2)的执行不会早于任务(1)的终止。实际上,由于选择约束而终止,因此task(2)将永远不会执行。

我的代码:

with Counter;
procedure Main is
    task type CounterTask is
        entry Execute(t:in Counter.Timeout; d:in Duration);
    end CounterTask;

    task body CounterTask is
        begin MyLoop: loop 
            select
                accept Execute(t:in Counter.Timeout;d:in Duration) do
                    Counter.Run(t, d);
                end Execute;
            or
                delay 2.0;
                exit;
            end select;
        end loop MyLoop;
    end CounterTask;
    tasks:Array(1..3) of CounterTask;
begin
    for i in Integer range 1..3 loop
        tasks(i).Execute(Counter.Timeout(10*i), Duration(0.5 * i));
    end loop;
end Main;
Run Code Online (Sandbox Code Playgroud)

任何提示或想法将是最欢迎的!

Sim*_*ght 6

当您的主程序调用该accept语句时

accept Execute(t:in Counter.Timeout;d:in Duration) do
   Counter.Run(t, d);
end Execute;
Run Code Online (Sandbox Code Playgroud)

它被阻塞直到end Execute。您没有显示Counter.Run,但我猜那里有一个delay t(或d?)。

您需要将Execute参数复制到accept语句中的本地任务变量,然后再调用Counter.Run; 这样,主程序和Countertask都可以自由进行。

task body CounterTask is
   Timeout : Counter.Timeout;
   Dur : Duration;
begin 
MyLoop:
   loop 
      select
         accept Execute(t:in Counter.Timeout;d:in Duration) do
            Timeout := T;
            Dur := D;
         end Execute;
         Counter.Run (Timeout, Dur);
      or
         delay 2.0;
         exit;
      end select;
   end loop MyLoop;
end CounterTask;
Run Code Online (Sandbox Code Playgroud)