Системное программирование в UNIX средствами Free Pascal

       

Задача об авиакомпании ACME Airlines


Теперь удастся разрешить конфликтную ситуацию в примере с авиакомпаний ACME Airlines. Для того, чтобы гарантировать целостность базы данных, нужно построить критический участок кода в программе acmebook следующим образом:

заблокировать соответствующий участок базы данных на запись

обновить участок базы данных

разблокировать участок базы данных

Если ни одна программа не обходит механизм блокировки, то запрос на блокировку гарантирует, что вызывающий процесс имеет исключительный доступ к критической части базы данных. Запрос на снятие блокировки снова делает доступной эту область для общего использования. Выполнение любой конкурирующей копии программы acmebook, которая пытается получить доступ к соответствующей части базы данных, будет приостановлено на стадии попытки наложения блокировки.

Текст критического участка программы можно реализовать следующим образом:

(* Набросок процедуры обновления программы acmebook *)

var

  db_lock:flockrec;

.

.

.

(* Установить параметры блокировки *)



db_lock.l_type := F_WRLCK;

db_lock.l_whence := SEEK_SET;

db_lock.l_start := recstart;

db_lock.l_len := RECSIZE;

.

.

.

(* Заблокировать запись в базе, выполнение приостановится *)

(* если запись уже заблокирована *)

fcntl(fd, F_SETLKW, longint(@db_lock));

if linuxerror <> 0 then

  fatal('Ошибка блокировки');

(* Код для проверки и обновления данных о заказах *)

.

.

.

(* Освободить запись для использования другими процессами *)

db_lock.l_type := F_UNLCK;

fcntl(fd, F_SETLK, longint(@db_lock));



Содержание раздела