Смешанный входной звонок и согласие выбрать в Аде? - PullRequest
0 голосов
/ 26 февраля 2019

Можно ли смешивать защищенные входящие вызовы (с барьером) с акцептами в одном операторе выбора?Без использования задержек и двух разных последовательных выборов, один для принятия и один для входных вызовов:

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
  ...

Я хочу, чтобы Задача была заблокирована в ожидании вызова Get, Put или получения открытого барьера в Alive.

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Обратите внимание, что вы можете сделать:

select
   Protected_Object.Alive;
then abort
   select
      accept Get;
   or
      accept Put;
   end select;
end select;

, что может дать вам то, что вы хотите, хотя понимание УВД может быть сложным.

0 голосов
/ 27 февраля 2019

Вот несколько вариантов, в зависимости от того, что вы ожидаете чаще:

Если вы ожидаете / хотите, чтобы 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;

В любом случае вам нужно будет решить, как / когда завершить этот цикл, если это необходимо.

...