Мне нужна помощь, а также некоторое понимание. Это программа в Ada-2005, которая имеет 3 задачи. Выходной сигнал равен «z». Если 3 задачи не выполняются в порядке их размещения в программе, тогда вывод может варьироваться от z = 2, z = 1 до z = 0 (это легко увидеть в программе, взаимное исключение пытается сделать вывод z = 2).Проблемы в Ada Concurrency
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.
Тогда
(б) с прагм, результат: В 100 попыток, вхождение 2: 84, 1 совпадения: 14, вхождение 0: 2.
Который является неожиданным, так как 2 результатов, близких идент скую. Что означает прагмы, или нет прагм, результат имеет такое же поведение.
Те, кто являются консультантами по аду, могут пролить свет на эту тему. Также предлагаются альтернативные решения с семафорами (если возможно).
Далее, на мой взгляд, для критического процесса (это то, что мы делаем с Ada), с прагмами результат должен быть z = 2, 100% в любое время, следовательно, или иначе эта программа должна называться 85% критической !!!! (Это не должно быть так с Ada)
@ Boris Pavlovic: Спасибо! .... Я боролся с форматированием кода! ... – Arkapravo
Дополнительная информация необходима. Какой компилятор? Какая операционная система? Какой процессор, он многоядерный? Несколько задач могут выполняться одновременно, поэтому, если для выполнения доступны два или более ядра ЦП, могут выполняться две или более задачи (если есть необходимая поддержка компилятора и ОС), независимо от того, имеет ли более высокий приоритет. –
О, и вы также не защищаете свои глобальные переменные (в частности, x и y), поэтому с потенциально несколькими задачами, запущенными на потенциально нескольких ядрах, чтением и записью одних и тех же переменных, есть * нет * гарантия того, что произойдет , Если это модель решения, которое вы преследуете, оно имеет серьезные ошибки и нуждается в фундаментальном переосмыслении. –