Loops Can';不能处理ada任务中的异常
我举了以下例子:Loops Can';不能处理ada任务中的异常,loops,select,task,call,ada,Loops,Select,Task,Call,Ada,我举了以下例子: 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
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;
带有Ada.TEXT\u IO;
使用Ada.TEXT\u IO;
主要程序是
任务测试是
进入电话1;
进入电话2;
结束试验;
任务体测试是
Num:整数:=5;
开始
环
当Num<5=>
接受电话
放线(“呼叫1!”);
结束通话1;
或者当Num>5=>
接受电话做什么
放线(“呼叫2!”);
结束通话2;
或
终止
终端选择;
端环;
当程序错误=>Put_行(“无需调用…:(”)时出现异常;
结束试验;
开始
试验1;
结束;
如果我是对的,当任务不能调用任何东西时,它会出现程序错误。当我运行它时,它会陷入一个无休止的while循环中。我如何解决这个问题?我想你是在尝试探索当没有打开的
选择备选方案时会发生什么
如果所有备选方案都已关闭且没有其他部分,则会引发异常程序_错误
问题是,terminate
是一个选择选项(,同上),无法关闭,因此并非所有选项都关闭,Test
位于terminate
,准备在主程序退出时终止。但主程序位于Test.Call1
死锁
如果您消除或终止
,您将得到预期的程序错误
;任务终止,主程序将得到任务错误
在理想情况下,编译器会发现两个accept
都不可能是开放的;想必没有人有足够的深度来实现检查(通常问题会不那么明显)。我想你是在尝试探索没有开放的选择替代方案时会发生什么
如果所有备选方案都已关闭且没有其他部分,则会引发异常程序_错误
问题是,terminate
是一个选择选项(,同上),无法关闭,因此并非所有选项都关闭,Test
位于terminate
,准备在主程序退出时终止。但主程序位于Test.Call1
死锁
如果您消除或终止
,您将得到预期的程序错误
;任务终止,主程序将得到任务错误
在理想情况下,编译器会发现这样一个事实,即accept
都不能打开;大概没有人有足够深刻的感受来实现检查(通常情况下,问题不会那么明显).你说得不对。有什么问题吗?如果我在下面的假设中是正确的,即你正在探索如果没有开放选择的替代方案会发生什么,那么如果你这样说而不是仅仅说“我有以下示例”,那会有所帮助.如果不是,正如雅各布所说,问题是什么?你是不对的。问题是什么?如果我在下面的假设中是正确的,你正在探索如果没有开放选择的替代方案会发生什么,如果你这样说,而不是仅仅“我有下面的例子”,那会有所帮助。如果不是,正如Jacob所说,问题是什么?例如,在现实世界的程序中,Num
永远不会改变这一点并不明显。选择性接受也不会是任务接受输入调用的唯一位置。如果我将代码从这个:或当Num>5=>修改为这个:或当Num>4=>时,我将得到无休止的循环。如何我能处理吗?Num>5
(或4
)处于Call2
的保护中,但您的主程序正在尝试Call1
。因此您仍然存在死锁(不是无止境的循环!尽管从外部看它们确实很相似)例如,在现实世界的程序中,Num
永远不会改变这一点并不明显。选择性接受也不是任务接受输入调用的唯一位置。如果我将代码从这个:或当Num>5=>修改为这个:或当Num>4=>时,我将得到无休止的循环。我如何处理这个问题?Num>5
(或4
)处于Call2
的保护中,但您的主程序正在尝试Call1
。因此您仍然存在死锁(不是无止境的循环!尽管从外部看它们确实相似)