next up previous contents
След.: Оператор SYNC MEMORY Выше: Операторы синхронизации Пред.: Операторы LOCK и UNLOCK   Содержание


Критические секции

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

[имя:]CRITICAL

операторы

END CRITICAL

Код внутри конструкции выполняется не более, чем одним образом в каждый момент времени. Примеры из [14]:

CRITICAL

GLOBAL_COUNTER[1] = GLOBAL_COUNTER[1] + 1

END CRITICAL

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

!объявление комассива и локальной переменной

INTEGER :: NUM_JOBS[*], JOB

!чтение числа заданий первым образом

IF (THIS_IMAGE() == 1) READ(*,*) NUM_JOBS

!синхронизация всех образов: дальнейшая работа возобновится

! только тогда, когда все образы дойдут до этой точки.

SYNC ALL

DO !цикл

CRITICAL !критическая секция

!получение номера задачи текущим образом -- с конца списка

JOB = NUM_JOBS[1]

!уменьшение номера задачи -- уже выполняемая задача снимается

NUM_JOBS[1] = JOB - 1

END CRITICAL !конец критической секции

IF (JOB > 0) THEN !проверка, получено ли задание

... !выполнение задания

Добавим несколько подробностей с точки зрения синхронизации.

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



Ilya A. Chernov 2012-12-19
X