我有以下示例:
with Ada.TEXT_IO;
use Ada.TEXT_IO;
procedure main is
task Test is
entry Call1;
entry Call2;
end Test;
task body Test is
Num : Integer := 5;
begin
loop
select when Num < 5 =>
accept Call1 do
Put_Line("Call1 called!");
end Call1;
or when Num > 5 =>
accept Call2 do
Put_Line("Call2 called!");
end Call2;
or
terminate;
end select;
end loop;
exception when PROGRAM_ERROR => Put_Line("Nothing to call... :(");
end Test;
begin
Test.Call1;
end;
如果我是对的,当任务无法调用任何内容时,任务会获得program_error。当我运行它时,它会陷入无休止的循环中。我该如何解决这个问题呢?
答案 0 :(得分:2)
我认为你正试图探讨在ARM 9.7.1(21)中没有开放select
替代方案时会发生什么,
如果所有替代方案都已关闭且没有其他部分,则会引发异常Program_Error。
问题是, terminate
是一个选择((4),同上)并且无法关闭,因此并非所有替代方案都已关闭且{{1}坐在Test
,准备在主程序退出时死亡。但主要计划是terminate
。死锁。
如果您取消Test.Call1
,则会获得您期望的or terminate
;任务终止,主程序获得Program_Error
。
在一个理想的世界中,编译器会发现Tasking_Error
都不能打开的事实;据推测,没有人能够深入地实施检查(通常问题就不那么明显了)。