gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:15:13 25 4
gpt4 key购买 nike

我是 Ada 新手。

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

预期的行为是所有这些都同时执行。

事实是,它们是一个接一个地被执行的。因此,tasks(2) 执行完毕后,tasks(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;

非常欢迎任何提示或想法!

最佳答案

当你的主程序调用accept语句时

accept Execute(t:in Counter.Timeout;d:in Duration) do
Counter.Run(t, d);
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;

关于concurrency - 我们可以不以同步方式运行池中的每个任务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54951776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com