2013-05-02 77 views
3

我有一个关于Ada中的“select then abort”语言结构的问题。Ada:select然后中止语句

select 
    delay 1.0; 
    do something with the partial result; 
then abort 
    loop 
    ... 
    long calculation 
    ... 
    entry call to other task; 
    ... 
    end loop; 
end select; 

能在中止分支代码中的任何地方或仅在某些点中止像延迟陈述或进入呼叫:我使用的是看起来像任务? 在我的程序中,中止分支中的代码执行长计算,并在中止时部分计算结果仍然有用。但是,如果代码可以在任何地方出现数据不一致问题。

谢谢

回答

1

根据这些信息在adaic.org,在then abortend select之间可以在任何地方被中止的部分。

2

中止可以发生在任何地方,除了中止延期的区域。受保护的操作是中止延迟区域,因此您可以将部分结果存储在受保护的对象中。

+0

[这里](http://www.adaic.org/resources/add_content/docs/95style/html/sec_6/6-3-3.html)他们说任务只能在中止完成时中止点。那么你确定你的答案是正确的吗? – Button 2013-05-04 14:55:47

+0

要求是中止的构造比_下一个中止完成点晚完成_no([RM:9.8(15)](http://www.adaic.org/resources/add_content/standards/12aarm/html/AA-9在19.b中的实现注释中说:“实现当然可以检查比每个中止完成点更频繁的中止;理想情况下,将提供完全先发制人的中止实施,如果不支持先占中止在给定的环境中,然后支持检查中止作为子程序调用和循环迭代的一部分可能是一个有用的选择。“ – egilhh 2013-05-04 18:58:11

+0

任何合理的现代操作系统和编译器都将支持先发制人的中止。如果你的平台有限制,你应该检查你的编译器文档确切的行为 – egilhh 2013-05-04 18:59:55