Средства программирования для многопроцессорных вычислительных систем. Немнюгин C.А. - 17 стр.

UptoLike

Составители: 

17
использование
преимущественно
локальных
по
отношению
к
потоку
,
а
не
разделяемых
переменных
;
управление
доступом
к
разделяемым
переменным
с
помощью
различных
средств
синхронизации
(
они
могут
быть
реализованы
с
помощью
семафоров
,
событий
,
критических
секций
,
взаимных
блокировок
-
мьютексов
).
Гонки
за
данными
могут
быть
скрыты
синтаксисом
языка
программирования
.
Некоторые
примеры
приведены
в
табл
. 1.
Таблица 1. Примеры конструкций языка программирования, в которых могут
возникать гонки за данными
Поток 1 Поток 2 Причина возникновения гонок за данными
X += 1 X += 2
Компилятор
заменяет
операцию
+=
раздельными
операциями
чтения
и
записи
X
A[i] += 1 A[j] += 2
Возможно
совпадение
значений
индексов
i
и
j
*p += 1 *q += 2
Указатели
p
и
q
могут
ссылаться
на
один
адрес
Func(1) Func(2)
Func
может
суммировать
значение
аргумента
и
значение
внутренней
разделяемой
переменной
Add
[abc], 1
add
[abc], 2
На
уровне
команд
модификация
[abc]
заменяется
раздельными
операциями
чтения
и
записи
Блокировки
Блокировка
(
тупик
)
возникает
,
если
поток
ожидает
выполнение
условия
,
которое
не
может
быть
выполнено
.
Обычно
возникновение
тупиковой
ситуации
является
следствием
конкуренции
потоков
за
ресурс
,
который
удерживается
одним
из
них
.
Условия
возникновения
тупика
:
доступ
к
ресурсу
эксклюзивен
(
возможен
только
одним
потоком
);
поток
может
удерживать
ресурс
,
запрашивая
другой
;
ни
один
из
конкурирующих
потоков
не
может
освободить
запрашиваемый
ресурс
.
Активной
блокировкой
называют
ситуацию
,
когда
поток
не
производит
вычислений
,
но
и
не
блокируется
.
Потоки
пытаются
преодолеть
помеху
,
создаваемую
другим
потоком
.