我在解决 ADA 中的有界缓冲区问题的这种变化时遇到了问题(我在 ADA 编程中非常新)。
我有两个可以写入缓冲区的任务(我们称之为 A 和 B)和一个从缓冲区(C)读取的任务。任务 A 当时将两个整数插入缓冲区,任务 B 仅插入一个。在从缓冲区任务 C 读取数据之前,需要确定哪个任务(A 或 B)最后将数据插入缓冲区,如果是其 A 则读取最后插入的两个整数,否则只有一个。
这就是我尝试实现缓冲区任务的方式,我想知道这是正确的做法:
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 时取消设置。
我将不胜感激任何帮助,谢谢!