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之间的所有语句它不应该打印其他任务语句直到第二个完成然后它应该去其他任务
答案 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
内阻止或无论如何阻止。
总的来说,事实是标准输出 - 您通过put
或put_line
访问的 - 是您从两个任务访问的共享资源。 Ada语言(ARM 9(8))说
任务可以通过读取和更新(未受保护的)共享变量来间接通信,假设访问通过其他类型的任务交互正确同步。
并且您没有进行任何形式的同步,因此系统可以做到它的感觉;结果不是由语言定义的。在类似的情况下,我看到一个任务输出“hello”,另一个输出“world”导致“hweolrllod”。