我需要一些帮助,也需要一些见解。这是 Ada-2005 中的一个程序,它有 3 个任务。输出是'z'。如果这 3 个任务没有按照它们在程序中的放置顺序发生,则输出可以从 z = 2、z = 1 到 z = 0 变化(这在程序中很容易看到,尝试互斥以确保输出是 z = 2)。
WITH Ada.Text_IO; USE Ada.Text_IO;
WITH Ada.Integer_Text_IO; USE Ada.Integer_Text_IO;
WITH System; USE System;
procedure xyz is
x : Integer := 0;
y : Integer := 0;
z : Integer := 0;
task task1 is
pragma Priority(System.Default_Priority + 3);
end task1;
task task2 is
pragma Priority(System.Default_Priority + 2);
end task2;
task task3 is
pragma Priority(System.Default_Priority + 1);
end task3;
task body task1 is
begin
x := x + 1;
end task1;
task body task2 is
begin
y := x + y;
end task2;
task body task3 is
begin
z := x + y + z;
end task3;
begin
Put(" z = ");
Put(z);
end xyz;
我第一次尝试这个程序
(a) 没有编译指示,结果:在 100 次尝试中,出现 2:86,出现 1:10,出现 0:4。
然后
(b) 使用编译指示,结果:在 100 次尝试中,出现 2:84,出现 1:14,出现 0:2。
这是出乎意料的,因为两个结果几乎相同。这意味着输出具有相同的行为。
那些是 Ada 并发大师的人请对这个话题有所了解。还邀请了带有信号量的替代解决方案(如果可能)。
在我看来,对于一个关键过程(这就是我们对 Ada 所做的),使用 pragma 的结果应该是 z = 2,始终 100%,因此,否则这个程序应该被称为 85% 关键!!!!(Ada 不应该这样)