助けと洞察力が必要です。これは 3 つのタスクを持つ Ada-2005 のプログラムです。出力は「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 の発生。
2 つの結果がほぼ同じであるため、これは予想外です。これは、出力が同じ動作をするプラグマまたはプラグマがないことを意味します。
Ada の同時実行の達人である方は、このトピックに光を当ててください。セマフォを使用した代替ソリューション (可能であれば) も招待されます。
さらに、クリティカル プロセス (これは Ada で行うことです) についての私の意見では、プラグマを使用すると、結果は常に z = 2、100% になるはずです。(エイダではそうではないはずです)