Пусть имеются три процесса ПР1, ПР2 и ПРЗ, которые вырабатывают соответственно сообщения Ml, M2 и МЗ. Эти сообщения представляют собой ресурсы
типа CR. Пусть процесс ПР1 является «потребителем» сообщения МЗ, процесс ПР2 получает сообщение Ml, а ПРЗ - сообщение М2 от процесса ПР2, то есть каждый из процессов является и «поставщиком» и «потребителем» одновременно, и вместе они образуют «кольцевую» систему (рис. 7.2) передачи сообщений через почтовые ящики (ПЯ). Если связь с помощью этих сообщений со стороны каждого процесса устанавливается в порядке, изображенном в листинге 7.1, то никаких трудностей не возникает. Однако перестановка этих двух процедур в каждом из процессов (листинг 7.2) вызывает тупик:
Листинг 7.1. Вариант без тупиковой ситуации
ПР1:
ПОСЛАТЬ СООБЩЕНИЕ (ПР2. Ml. ПЯ2); ВДАТЬ С09БЩЕНИЕ (ПРЗ, МЗ. ПЯ1);
ПР2:
ПОСЛАТЬ СООБЩЕНИЕ (ПРЗ. М2. ПЯЗ); «ДАТЬ СООБЩЕНИЕ (ПР1. Ml. ПЯ2):
ПРЗ:
ПОСЛАТЬ СООБЩЕНИЕ (ПР1. МЗ. ПЯ1); ЖДАТЬ СООБЩЕНИЕ (ПР2, М2. ПЯЗ);
Листинг 7.2. Вариант с тупиковой ситуацией
ПР1:
;ВДАТЬ СООБЩЕНИЕ (ПРЗ. МЗ. ПЯ1): ПОСЛАТЬ СООБЩЕНИЕ (ПР2, Ml. ПЯ2):
ПР2:
ЖДАТЬ СОО&ЩЕНИЕ (ПР1. Ml. ПЯ2); ПОСЛАТЬ СООБЩЕНИЕ (ПРЗ. М2, ПЯЗ);
ПРЗ:
ЖДАТЬ СООБЩЕНИЕ (ПР2. М2. ПЯЗ); ПОСЛАТЬ СООБЩЕНИЕ (ПР1. МЗ. ПЯ1);
В самом деле, во втором варианте ни один из процессов не сможет послать сообщения до тех пор, пока сам его не получит, а этого события никогда не произойдет, поскольку ни один процесс не может этого сделать.