В качестве дополнения к ответу Саймона Райта я считаю, что ARM 9.5.1 (15) ,
Во время защищенного действия это ограниченная ошибка длявызвать операцию, которая потенциально блокирует.Следующие элементы определены как потенциально блокирующие операции:
[...]
- внешний вызов защищенной подпрограммы (или внешний запрос) с тем же целевым объектом, что изащищенного действия;
и ARM 9.5.1 (17) ,
Если обнаружена ограниченная ошибка, возникает Program_Error.Если не обнаружено, ограниченная ошибка может привести к взаимоблокировке или (вложенному) защищенному действию для того же целевого объекта.
также применимо.Если это так, то выполнение внешнего вызова для защищенной подпрограммы может привести к взаимоблокировке, но может также привести к продолжению работы программы (или к возникновению ошибки Program_Error).
Я выполнил программу на GNAT CE 2018 как для Windows, так и для Linux (Debian).Программа в Windows работает до конца, но зависает в Linux после печати 3.
Для уточнения комментариев ниже: вы можете использовать конфигурационную прагму Detect_Blocking
, чтобы проверить время выполнения Ada дляэти потенциально блокирующие вызовы (см. ARM H.5 ).
Если вы используете GPRbuild, то вы можете включить обнаружение, поместив pragma Detect_Blocking;
в файл (обычно с именем gnat.adc
)и сослаться на этот файл конфигурации в файле проекта, добавив атрибут Local_Configuration_Pragmas
в пакет компилятора (см. также здесь и здесь ):
project Default is
for Source_Dirs use ("src");
for Object_Dir use "obj";
for Main use ("main.adb");
package Compiler is
for Local_Configuration_Pragmas use "gnat.adc";
end Compiler;
end Default;