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中实现异步任务。
答案 0 :(得分:3)
如果您使用的是Ada 2012,那么可以使用Ada.Containers.Unbounded_Synchronized_Queues(或Bounded版本):您的用户代码调用Enqueue
,您的服务器任务调用{ {1}}如果队列为空则阻塞。
如果没有,通常的方法是使用您自己的受保护对象来封装队列(Ada 2012包就是这样做的)。像
这样的东西Dequeue
然后
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;