Как работает свидание? - PullRequest
       10

Как работает свидание?

1 голос
/ 26 января 2011

Я готовлюсь к экзамену и с трудом разбираюсь в Свидании. Вот пример, я смотрю

While(1) {
 select{
  when a == TRUE :
   accept A() {f1; b=FALSE}
  when b == TRUE :
   accept B() {f2; a=FALSE}
  else {a=true; b=true}
 }
}

Следующие звонки поступают в указанном порядке: A (), B (), B (), A (), A (), B ()

В каком порядке будут приниматься звонки? А может ли абонент А или Б голодать?

Я бы очень признателен за любую помощь. Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 26 января 2011

Это не Ада. На всех.

Чтобы узнать, как работать с настоящей Ада, прочитайте главу 14 Ада Дистиллированная .

И, честно говоря, если вы не признали свой пример не Ада, вам, вероятно, следует начать с Главы 1.

3 голосов
/ 26 января 2011

Исходя из логики вашей задачи, а не синтаксиса, я думаю, что ответ «все зависит».

Задача, которая выполняет этот цикл (назовите его Server), находится в занятом цикле(в большинстве случаев цикл будет заканчиваться настройкой A := True; B := True;).Это может израсходовать весь ваш ЦП и погасить другие задачи.

Предполагается, что этого не произойдет, и у вас есть 2 клиентские задачи A_Caller и B_Caller, которые имеют более высокий приоритет, чем Server, и вызывают ихзаписи относительно редко, тогда вы можете получить

  1. A_Caller и B_Caller и запустить и вызвать их соответствующие записи.
  2. Server входит в select и находит обоих охранниковоткрыть и записи называются;он выбирает A (он мог выбрать B).Охрана B закрыта.
  3. В следующий раз в цикле охрана A открыта, но нет звонящего;охрана B закрыта;else часть выбрана, поэтому защита B открыта.
  4. В следующий раз в цикле Server принимает B;защита A закрыта.
  5. В следующий раз в цикле защита B открыта, но нет звонящего;часть else выбрана, поэтому защита A открыта.
  6. В следующий раз в цикле оба охранника открыты, но вызывающего абонента нет, поэтому часть else выбирается снова, и мыspin.

Очевидно, что точная последовательность будет зависеть от того, когда поступят входные вызовы относительно цикла Server.Если предположить, что входящие вызовы в вашем вопросе происходят через секунду, записи будут приниматься в следующем порядке.

Я не думаю, что вы можете получить голодание, если один из вызывающих абонентов не запускается достаточно часто, чтобы он называл еговход снова, прежде чем Server вернется к своей петле.Было бы трудно добиться этого в ОС общего назначения.

2 голосов
/ 26 января 2011

Это не похоже на синтаксис ada, возможно, вы можете сделать репост с кодом ada?Между тем я отсылаю вас к: http://en.wikibooks.org/wiki/Ada_Programming/Tasking#Rendezvous

...