gpt4 book ai didi

asynchronous - Ada 中的触发和忘记进入/接受机制

转载 作者:行者123 更新时间:2023-12-04 20:01:11 25 4
gpt4 key购买 nike

Ada 中是否存在即发即忘机制的模式?当我调用一个任务条目时,我不希望调用者在消息被处理之前被阻塞。我希望任务是异步的。我试过的是

loop
select
accept xxx(params) do
-- save the parameters in a queue
end accept;
...
else
-- pick the next item off the queue and process it
end select;
end loop;

这看起来像是一个笨拙的机制。也许开火后忘记是错误的术语。我还尝试过一项任务填满队列,另一项任务从队列中取出条目。有没有更好的方法在 Ada 中实现异步任务。

最佳答案

如果您使用的是 Ada 2012,则方法是使用 Ada.Containers.Unbounded_Synchronized_Queues (或 Bounded 版本):您的用户代码调用 Enqueue,您的服务器任务调用 Dequeue,如果队列为空则阻塞。

如果没有,通常的方法是使用您自己的 protected 对象来封装队列(Ada 2012 包就是这样做的)。有点像

package Parameters is new Ada.Containers.Vectors (Positive, Parameter);
protected Queue is
procedure Put (P : Parameter);
entry Get (P : out Parameter);
private
The_Queue : Parameters.Vector;
end Queue;

protected body Queue is
procedure Put (P : Parameter) is
begin
The_Queue.Append (P);
end Put;
entry Get (P : out Parameter) when not The_Queue.Is_Empty is
begin
P := The_Queue.First_Element;
The_Queue.Delete_First;
end Get;
end Queue;

然后

task body Server is
P : Parameter;
begin
loop
Queue.Get (P);
-- process P
end loop;
end Server;

关于asynchronous - Ada 中的触发和忘记进入/接受机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22479087/

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