Составители:
Рис. 3. Барьер-бабочка для 8 процессов.
Замечание. Ошибка в синхронизации может возникнуть в сле-
дующих обстоятельствах. Предположим, что процесс 2 работа-
ет значительно мед лен не е остальных. Пусть процесс 1 подошел
к барьеру: arrive[1] = 1, а процесс 2 задерживается так, что
arrive[2] = 0; пусть еще процессы 3 и 4 подошли к барьеру: те-
перь процесс 3 будет синхронизироваться с процессом 1; в резуль-
тате процесс 3 переходит на уровень 3, хотя флаг arrive[1] = 1 был
установлен для процесса 2 (который задерживается). Теперь может
отработать третий уровень так, как будто все процессы подошли к
барьеру (однако, процесс 2 еще не подошел к барьеру): в результате
некоторые процессы пройдут барьер раньше, чем нужно, а другие
будут бесконечно ждать у барьера.
Для того, чтобы избежать такой ошибки, можно использовать
целочисленные флаги как счетчики, которые увеличивают свой но-
мер в соответствии с прохождением очередного уровня барьера.
Будем считать,что начальное значение флага arrive[i] равно 0,
а при переходе на новый уровень барьер arrive[i] увеличивается
на 1. Предположим, что рабочий пр оцес с с i-м номер ом опр еде ля-
ет номер j своего партнера на достигнутом уровне и ожидает, пока
arrive[j] станет таким же, как arrive[i]. Таким образом, получаем
следующую программную схему.
БАРЬЕР ДЛЯ РАБОЧЕГО ПРОЦЕССА С НОМЕРОМ i
for [s = 1 to num_stages] { # “до числа уровней барьера”
arrive[i] = arrive[i] + 1;
68
Страницы
- « первая
- ‹ предыдущая
- …
- 65
- 66
- 67
- 68
- 69
- …
- следующая ›
- последняя »
