ADAの境界バッファ問題に関するこのバリエーションの解決に問題があります(ADAプログラミングでは非常に新しいです)。
バッファに書き込むことができる2つのタスク(AとBと呼びましょう)と、バッファから読み取る1つのタスク(C)があります。タスク A は一度に 2 つの整数をバッファーに挿入し、タスク B は 1 つだけ挿入します。バッファ タスク C からデータを読み取る前に、どちらのタスク (A または B) が最後にデータをバッファに挿入したかを判断する必要があります。
これは、バッファタスクを実装しようとしている方法です。これを行う適切な方法は次のとおりです。
task bbuffer is
N : constant Integer := 20;
buffer : array(0..N-1) of Integer;
pointer : Integer range 0..N-1;
count : Integer range 0..N;
flag : Integer range 0..1;
begin
loop
select
when count < N =>
accept PutOne(v:in Integer) do
buffer((pointer+count) mod N) := v;
count:=count+1;
end Put;
or
when count < N-1 =>
accept PutTwo(v1:in Integer, v2:in Integer) do
buffer((pointer+count) mod N) := v1;
buffer((pointer+count+1) mod N) := v2;
count:=count+2;
end Put;
or
-- THIS IS WHERE MY PROBLEM IS. Reading from buffer.
-- I first need to determine what to call between ReadOne and ReadTwo
accept GetFlag(f:out Integer) do
f:=flag;
end GetFlag;
select
when count > 0 =>
accept GetOne(v:out Integer) do
v:=buffer(pointer);
pointer := (pointer + 1) mod N;
count := count + 1;
end GetOne;
or
when count > 1 =>
accept GetTwo(v1:out Integer, v2:out Integer)do
v1:=buffer(pointer);
v2:=buffer((pointer+1) mod N);
pointer := (pointer + 2) mod N;
count := count + 2;
end GetTwo;
end select;
end select;
end loop;
end bbuffer;
フラグは、A がバッファに書き込むときに設定され、B のときに設定解除されます。
これについて何か助けていただければ幸いです、ありがとう!