Блокировка ресурса
Каноническим примером использования инициализации (Initialize) и очистки (Finalize) совместно со ссылочным дискриминантом может служить следующий пример организации монопольного доступа к общему ресурсу:
type Handle(Resource: access Some_Thing) is
new Finalization.Limited_Controlled with null record; procedure Initialize (H: in out Handle) is begin Lock(H.Resource); end Initialize; procedure Finalize (H: in out Handle) is begin Unlock(H.Resource); end Finalize; . . . procedure P (T: access Some_Thing) is H: Handle(T); begin . . . -- монопольная обработка T end P; |
В данном случае, суть идеи заключается в том, что описание H внутри процедуры P
приводит к автоматическому вызову операции Initialize которая, в свою очередь, вызывает операцию блокировки ресурса Lock, после чего, внутри процедуры P, ресурс используется монопольно.
Операция очистки Finalize, которая вызывает операцию освобождения ресурса Unlock, будет гарантированно вызвана, вне зависимости от того как произошло завершение работы процедуры P
(нормальным образом, в результате исключения или в результате абортирования обработки).
Подобный прием удобен для гарантированной организации работы парных операций, подобных операциям открытия и закрытия файлов.