Мне нужна помощь, а также понимание. Это программа в Аде-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;
Я впервые попробовал эту программу
(а) без прагм, результат: в 100 попытках, вхождение 2: 86, вхождение 1: 10, вхождение 0: 4.
Тогда
(b) с прагмами, результат: в 100 попытках, вхождение 2: 84, вхождение 1: 14, вхождение 0: 2.
Что неожиданно, так как 2 результата почти идентичны. Что означает прагму или отсутствие прагмы, результат имеет то же поведение.
Те, кто являются гуру параллелизма Ады, пожалуйста, пролите немного света на эту тему. Альтернативные решения с семафорами (если это возможно) также предлагается.
Далее, на мой взгляд, для критического процесса (именно так мы поступаем с Ada), с прагмами результат должен быть z = 2, 100% всегда, следовательно, иначе программа должна называться критической 85%! !!! (Это не должно быть так с Ада)