Ada - 任务终止错误 - "Statement expected"

Ada - Task termination error - "Statement expected"

我有以下任务

   task body auto is
   begin
      Put_Line( licencepalte.all & " set off.");
      delay traveltime.all;
      Put_Line( licencepalte.all & " arrived.");
      loop
         select
            indicator.passthrough;
            terminate; -- error for this line: 'statement expected'
         or 
            delay 0.2;
            Put_Line( licencepalte.all & " is waiting.");
         end select;
      end loop;
   end auto;

这里我们代表一个指示灯和一些有任务和受保护的汽车(汽车~汽车)。我的主要问题是,我不知道如何终止,以防指示器接受自动输入。你可以看到我目前正在尝试做什么,它会弹出一个错误(见内联)。条目被接受后如何停止任务?为什么这个 terminate 不起作用?谢谢!

如果我对你的问题的理解正确,exitterminate 更好。

terminate 不是您执行的 "action"。也就是说,您不能在任务主体中选择的任何位置使用 terminate 语句来终止任务。终止任务的方法是执行到结束主体的end;在您的情况下, exit 退出循环有效,就像雅各布的回答一样。

or terminate 的目的是告诉程序任务可以终止(我不知道是否有更好的技术术语)。假设您的任务如下所示:

task body Task_Type_1 is 
begin
    loop
        select
            accept Entry_1(...parameters...) do
                -- something
            end Entry_1;
        or
            accept Entry_2(...parameters...) do
                -- something
            end Entry_2;
        end select;
    end loop;
end Task_Type_1;

如果 accept 语句的 "something" 代码永远不会退出循环,则任务永远不会终止。这意味着包含任务的其他构造永远不会终止。例如:

procedure Proc is
    T1 : Task_Type_1;
begin
    -- do some stuff
    -- now we're at the end, and we have to wait for T1 to complete
end Proc;

该过程创建类型为 Task_Type_1 的任务并启动它。然后执行程序的主体。当达到 end Proc; 时,该过程不会立即终止,因为它必须等到任务完成其工作。但是按照任务的编写方式,任务永远不会完成。因此 Proc 永远不会 return,并且程序可能会死锁。

or terminate 表示任务可以终止:

task body Task_Type_1 is 
begin
    loop
        select
            accept Entry_1(...parameters...) do
                -- something
            end Entry_1;
        or
            accept Entry_2(...parameters...) do
                -- something
            end Entry_2;
        or 
            terminate;
        end select;
    end loop;
end Task_Type_1;

在这个小例子中,我们有一个只创建这个任务的过程,or terminate 意味着:如果这个任务到达一个点,它在select 因为没有任何入口调用在等待, 如果 Proc 已到达其代码的末尾, 我们终止任务。任务体退出,所有需要做的finalization都完成了,然后Proc就可以完成了。

or terminate 只能在 "selective accept" 中使用。如果你说 select Some_Other_Task.Entry_2(...); 以便它阻塞直到另一个任务的条目可用,你不能在那种 select.

中使用 or terminate

在更复杂的情况下,一个过程可以创建两个或多个任务。当该过程到达其 end 语句时,它不会 return 直到(粗略地说)它创建的所有任务都已完成 所有尚未完成的任务'completed 在 select 具有 or terminate 子句的语句上被阻止。如果发生后者,则所有这些任务都完成,然后该过程可以 return.

关于"terminate alternatives"的规则在RM 9.3(6)中。讲的是依赖师父;在我上面显示的例子中,Proc 是主人。