Введение в программирование - Учебное пособие (Корочкин А. В.)

9.11 разделяемые переменые

В языке в задачах могут использоваться разделяемые ( общие ) переменные.

Разделяемые ( shared ) переменные - это переменные ( обьекты ) в общей памяти, которые используются для взаимодействия задач и дос­туп к которым для чтения или изменения возможен из нескольких за­дач в программе.

Так как при выполнении программы возможна ситуация, при кото­рой задачи одновременно обращаются к разделяемым переменным, то во избежание конфликтных ситуаций и корректности работы програм­мы необходимо обеспечить синхронизированный доступ задач к разде­ляемым переменным. Синхронизированный доступ к разделяемым пе­ременным - фундаментальная задача параллельного программирова­ния, называемая задачей взаимного исключения. Ее решение основыва­ется на том, что в любой момент времени доступ к разделяемой пере­менной должен предоставляться только одной задаче. В языках про­граммирования для организации синхронизированного доступа ис-

100

Ада 95. Введение в программирование

101

Глава 9.   Задачи

 

 

пользуются специальные программно-аппаратные средства: семафо­ры, критические участки, мониторы и др.

Ада 83 обеспечивала управляемый доступ к разделяемым перемен­ным с помощью прагмы Shared, которая гарантировала неделимость операций чтения и изменения над ними. К сожалению, область приме­нения прагмы Shared была ограничена. В частности, прагму нельзя было использовать для компонентов массива, а сам массив требовал работы с ним только через ссылочный тип.

По этой и другим причинам, в Аде 95 прагма Shared заменена на две прагмы : Atomic и Volatile.

Pragma  ATOMIC ( Локальное_Имя ) ;

Pragma  ATOMIC_COMPONENTS (Локальное_Имя_Массива ) ;

Pragma  VOLATILE ( Локальное_Имя ) ;

Pragma  VOLATILE_COMPONENTS ( Локалъное_Имя_Массива ) :

Здесь:

•   Локалъное_Имя - описание обьекта или описание типа.

•   Локальное_Имя_Массива -    описание типа массива или обьекта,

имеющего анонимный тип массива.

Прагма Atomic для всех обьектов, указанных в ней ( atomic -обьектов ), обеспечивает неделимость операций их чтения и изменения. Операции над atomic-обьектами выполняются только последователь­но.

Прагма Volatile для обьектов, указанных в ней ( volatile - обьек­тов ), обеспечивает выполнение операций чтения и изменения над ними непосредственно в памяти.

П Примеры:

Size :    integer; pragma Atomic (Size);

Flag   : boolean; pragma Volatile ( Flag );

type Elem is new fixed ; pragma Atomic ( Elem ) ;

type Vector is array (1 .. N) of  integer; pragma  Atomic_Components ( Vector);

Matrix :   array (1 .. 10 , 1 .. 20 )   of  fixed ; pragma   Volatile _Components ( Matrix);

Разделяемые переменные и прагмы для них можно использовать в языке для:

•   взаимодействия задач;

•   взаимодействия   Ада программ   с другими процессами, не являю­щимися Ада программами;

•   организации управления устройствами в Ада программах.

Щ СОВЕТЫ:

•  Не используйте не защищенные прагмами разделяемые переменные для синхронизации задач.

•  Используйте для разделяемых переменных прагмы    Atomic      и Volatile.