ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
30
•
повышение надежности параллельных систем, так как полностью защищает
управление ресурсом;
•
обеспечение гарантированного получения ресурса.
Примеры
Существует классическая задача передачи данных между процессами "чита-
тель-писатель". Процесс "писатель" генерирует информацию, а "читатель" ее по-
требляет. Обмен блоками информации осуществляется через специальные буферы,
число которых ограничено. Одним из возможных вариантов буфера может быть
циклический список.
Решение задачи с помощью блокировок
char buf[N];
int head = 0, tail = 0, n = 0;
lock_t lock_status;
void put(char с) {
while ( n == N) wait () ;
lock(lock_status) ;
buf[head] = с;
head = (head + l)%N;
n++;
unlock(lock_status) ; } char get () {
while ( n == 0) wait () ;
lock(lock_status) ;
c = buf[tail];
tail = (tail + l}%N;
n—;
unlock(lock_status) ;
return c;
}
Решение задачи с использованием семафоров
char buf[N];
int head = 0, tail = 0;
sema_t holes, chars;
init_sema(holes, N);
init_sema(chars, 0);
void put(char c) {
P(holes);
buf[head] = c;
head = (head + l)%N;
V(chars); }
char get() {
P(chars);
c = buf[tail];
tail = (tail + 1)%N;
V(holes);