Исходя из логики вашей задачи, а не синтаксиса, я думаю, что ответ «все зависит».
Задача, которая выполняет этот цикл (назовите его Server
), находится в занятом цикле(в большинстве случаев цикл будет заканчиваться настройкой A := True; B := True;
).Это может израсходовать весь ваш ЦП и погасить другие задачи.
Предполагается, что этого не произойдет, и у вас есть 2 клиентские задачи A_Caller
и B_Caller
, которые имеют более высокий приоритет, чем Server
, и вызывают ихзаписи относительно редко, тогда вы можете получить
A_Caller
и B_Caller
и запустить и вызвать их соответствующие записи. Server
входит в select
и находит обоих охранниковоткрыть и записи называются;он выбирает A
(он мог выбрать B
).Охрана B
закрыта. - В следующий раз в цикле охрана
A
открыта, но нет звонящего;охрана B
закрыта;else
часть выбрана, поэтому защита B
открыта. - В следующий раз в цикле
Server
принимает B
;защита A
закрыта. - В следующий раз в цикле защита
B
открыта, но нет звонящего;часть else
выбрана, поэтому защита A
открыта. - В следующий раз в цикле оба охранника открыты, но вызывающего абонента нет, поэтому часть
else
выбирается снова, и мыspin.
Очевидно, что точная последовательность будет зависеть от того, когда поступят входные вызовы относительно цикла Server
.Если предположить, что входящие вызовы в вашем вопросе происходят через секунду, записи будут приниматься в следующем порядке.
Я не думаю, что вы можете получить голодание, если один из вызывающих абонентов не запускается достаточно часто, чтобы он называл еговход снова, прежде чем Server
вернется к своей петле.Было бы трудно добиться этого в ОС общего назначения.