Ada中的火灾和忘记进入/接受机制

时间:2014-03-18 12:14:45

标签: asynchronous ada

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中实现异步任务。

1 个答案:

答案 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;