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. |
| Оглавление| |