首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ada中的火灾和遗忘进入/接受机制

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

Stack Overflow用户
提问于 2014-03-18 12:14:44
回答 1查看 351关注 0票数 3

在Ada有火灾和遗忘机制的模式吗?当我调用任务条目时,我不希望调用者在消息被处理之前被阻塞。我希望这个任务是异步的。我试过的是

代码语言:javascript
复制
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中实现异步任务。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-18 12:50:58

如果您正在使用Ada 2012,那么应该使用排队 (或有界版本):用户代码调用Enqueue,服务器任务调用Dequeue,如果队列为空,则调用Dequeue

如果不是,通常的方法是使用您自己的受保护对象来封装队列(这是Ada 2012包所做的)。有点像

代码语言:javascript
复制
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;

然后

代码语言:javascript
复制
task body Server is
   P : Parameter;
begin
   loop
      Queue.Get (P);
      --  process P
   end loop;
end Server;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22479087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档