Ada语句'accept start do'中的任务没有完成所有执行?

时间:2015-02-26 17:04:56

标签: task ada

Ada'accept start do'中的任务是否未完成其全部执行?

接受开始做

这里'do'关键字强制编译器完成do和end关键字之间的所有执行提及,但为什么在下面的代码中它不会发生?为什么它打印其他任务主体即首先(任务名称)而不是它自己的任务(即启动)在下面的代码?请帮我理解我哪里出错了?

procedure main is
   task first is
      entry start;
   end first;

   task body first is
   begin
      accept start ;   -- i am not using do here

      put_line("first");
      put_line("first");
      put_line("first");
   end first;

   task second is
      entry start;
   end second;

   task body second is
   begin
      accept start do -- here 'do' keyword will force compile to finish all the execution between keyword 'do' and end? but why it is mixing statement of task first? 
         for i in 1..10 loop
            put_line("second");
         end loop;
      end start;
   end second;

begin
   first.start;
   second.start;
end main;

   output-
   second
   second
   second
   second
   first   -- why first get printed between before completing second?
   first
   first
   second
   second
   second
   second
   second
   second

注意 - 每次给出不同的o / pi时,如果第一个任务被激活,那么它应该首先完成do和end之间的所有语句它不应该打印其他任务语句直到第二个完成然后它应该去其他任务

1 个答案:

答案 0 :(得分:5)

接受first.start后,first已准备好在获得处理器时输出一行,而main会继续并调用second.start

接受second.start后,second输出其10行,然后将控件返回main

但是,如果在Ada运行时系统甚至操作系统内部发现put_line涉及阻塞,会发生什么?

在这种情况下,second被阻止,因此first可以自由进行并输出其中一行。此时first可能会再次被阻止,因此second有机会......

因此,您的操作系统(以及我的操作系统 - Mac OS X)似乎会在put_line内阻止或无论如何阻止。

总的来说,事实是标准输出 - 您通过putput_line访问的 - 是您从两个任务访问的共享资源。 Ada语言(ARM 9(8))说

  

任务可以通过读取和更新(未受保护的)共享变量来间接通信,假设访问通过其他类型的任务交互正确同步。

并且您没有进行任何形式的同步,因此系统可以做到它的感觉;结果不是由语言定义的。在类似的情况下,我看到一个任务输出“hello”,另一个输出“world”导致“hweolrllod”。