Page 113 - 6571
P. 113
Лістинг 17 – Бар’єрна синхронізація з використанням сема-
форів
sem arrive1 = 0, arrive2 = 0;
process Worker1 {
...
V(arrive1); /* сигнал про прибуття */
P(arrive2); /* очікування іншого процесу */
...
}
process Worker2 {
...
V(arrive2); /* сигнал про прибуття */
P(arrive1); /* очікування іншого процесу */
...
}
3. Задача про виробників та споживачів (спільні двійкові се-
мафори). Розглянемо знову задачу про виробників та споживачів.
У попередньому прикладі передбачалося, що існує тільки один
виробник і один споживач. Узагальнимо ту ж саму задачу на де-
кілька виробників і декілька споживачів. Приведене нижче рі-
шення демонструє ще один випадок застосування семафорів в
якості сигнальних прапорців і вводить важливе поняття спільного
двійкового семафора, що визначає ще один спосіб захисту крити-
чних секцій коду.
У задачі про виробників і споживачів виробники
пересилають повідомлення споживачам. Процеси спілкуються за
допомогою спільного буфера, що керується двома операціями:
deposit (помістити) і fetch (витягти). Виконуючи операцію
deposit, виробники поміщають повідомлення в буфер, а
споживачі в свою чергу отримують повідомлення за допомогою
операції fetch. Для того щоб повідомлення не перезаписувалося
і кожне з повідомлень могло бути прийняте споживачем тільки
один раз, виконання операцій deposit та fetch повинне
чергуватися, причому першою завжди повинна бути операція
deposit.
Реалізувати необхідне чергування операцій можна за
допомогою семафорів. У даному випадку семафори
використовуються або для повідомлення про те, що процеси
112