在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中实现异步任务。
发布于 2014-03-18 12:50:58
如果您正在使用Ada 2012,那么应该使用排队 (或有界版本):用户代码调用Enqueue,服务器任务调用Dequeue,如果队列为空,则调用Dequeue。
如果不是,通常的方法是使用您自己的受保护对象来封装队列(这是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;https://stackoverflow.com/questions/22479087
复制相似问题