Каков хороший способ связать индексированную задачу с соответствующим индексированным защищенным типом в SPARK?
В качестве примера рассмотрим следующую настройку:
subtype Thread_Range is Natural range 1..n;
protected type P is ... end P;
p: array(Thread_Range) of P;
Для каждого p(i)
Iхотел бы задачу t(i)
, которая отслеживает p(i)
и, когда она готова, обрабатывает ее.Я могу сделать это довольно легко в Ada, но SPARK w / Ravenscar более требователен.Я пробовал два подхода, которые, кажется, работают нормально, когда я запускаю их:
- Дайте
T
дискриминант Integer
, а затем создайте T(i);
для каждого i
, но это растетобременительный с не очень-большим i
.
task type T(which: Integer);
t1: T(1);
t2: T(2);
...
Добавьте функцию
is_not_monitored
и процедуру
set_monitor
к
P
.Создайте массив задач
без дискриминанта.Когда начинается
t(i)
, он назначает себе монитор для первого
p(j)
, который обнаруживает, что ему еще не назначен монитор.
task type T;
task body T is
which: Integer;
available: Boolean;
begin
for i in Thread_Range loop
available := p(i).is_not_monitored;
if available then
p(i).set_monitor;
which := i;
end if;
end loop;
-- what the task does with p(i) follows
end T;
t: array(Thread_Range) of T;
Мне нравится второй, лучше, но немного.В любом случае, SPARK «Prove» ворчит о потенциальных гонках данных, и я понимаю, почему (хотя я не уверен, что это на самом деле из-за этого).
Отсюда вопрос.