是否可以在一个select语句中混合受保护的入口调用(带屏障)和accept?不使用延迟和两个不同的连续选择,一个用于接受,一个用于条目呼叫:
task body Task is
begin
select
accept Get;
or
accept Put;
or
Protected_Object.Alive;
end select;
end Task;
protected body Protected_Object is
begin
entry Alive when Is_Alive is
...
我希望Task被锁定,等待调用Get,Put或者在Alive中打开障碍。
以下是一些替代方案,具体取决于您期望更频繁发生的事情:
如果您希望/希望Get / Put比Alive更频繁地发生:
task body Test is
begin
loop
select
accept Get;
or
accept Put;
or
-- Pick a value that makes sense
-- This is how long you check Get
-- and Put before trying Alive
delay 0.0001;
-- Asynchronous transfer of control
-- will try Protected_Object.Alive
-- until the second delay is finished
select
-- Pick a value that makes sense
-- Should be much smaller than the above
-- delay
delay 0.0000001;
then abort
Protected_Object.Alive;
end select;
end select;
end loop;
end Test;
如果您希望/希望Alive比Get / Put更频繁地检查,那么:
task body Test is
begin
loop
select
accept Get;
or
accept Put;
else
-- Asynchronous transfer of control
-- will try Protected_Object.Alive
-- until the delay is finished
select
-- Pick a value that makes sense
delay 0.0001;
then abort
Protected_Object.Alive;
end select;
end select;
end loop;
end Test;
无论哪种方式,如果需要,您需要决定如何/何时结束该循环。
请注意,您可以这样做:
select
Protected_Object.Alive;
then abort
select
accept Get;
or
accept Put;
end select;
end select;
这可能会给你你想要的东西,虽然理解ATC可能会很棘手。