Page 64 - 6571
P. 64
Процеси Producer і Consumer повинні отримувати доступ
до змінної buf по черзі. Спочатку Producer поміщає перший
елемент з масиву a в змінну buf, потім Consumer витягує її із
змінної buf, після чого Producer поміщає в змінну buf наступ-
ний елемент з масиву a і так далі. Нехай спільні змінні p та c ви-
ступають лічильниками числа поміщених і витягнутих елементів.
Їхні початкові значення дорівнюють 0. Тоді умови для синхроні-
зації процесів Producer і Consumer можуть бути записані в на-
ступному вигляді:
PC: c<= p<= c+1
Значення змінних c та p можуть відрізнятися не більше ніж
на 1. Це означає, що Producer помістив у буфер максимум на
один елемент більше, ніж Consumer витягнув. Код цих двох про-
цесів приведений в лістингу 2.
Лістинг 2 – Копіювання масиву від «виробника» до «спожи-
вача»
int buf, p = 0, c = 0;
process Producer {
int a[n];
while (p <n) {
< await (p == c);>
buf = a[p];
p = p+1;
}
}
process Consumer {
int b[n];
while (c <n) {
< await (p> c);>
b[c] = buf;
c = c+1;
}
}
Процеси Producer і Consumer використовують змінні p та c
для синхронізації доступу до буфера buf. Оператори await за-
стосовуються для призупинення процесів до тих пір, поки буфер
не стане повним або порожнім. Якщо умова p == c істинна, то
63