gpt4 book ai didi

Ada 语句 'accept start do ' 中的任务未完成全部执行?

转载 作者:行者123 更新时间:2023-12-01 22:19:28 24 4
gpt4 key购买 nike

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/p时,我期望如果第二个任务首先被激活,那么它应该首先完成do和end之间的所有语句,它不应该打印其他任务语句,直到第二个任务完成然后它应该去其他任务

最佳答案

接受 first.start 后,first 准备在获得处理器时输出一行,而 main 继续并调用第二个.start

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

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

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

看来你的操作系统(和我的 - Mac OS X)在 put_line 内阻塞,或者至少可以阻塞。

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

tasks can communicate indirectly by reading and updating (unprotected) shared variables, presuming the access is properly synchronized through some other kind of task interaction.

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

关于Ada 语句 'accept start do ' 中的任务未完成全部执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28748433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com