Составители:
рассматриваемой ситуации эти флаги называются “флагами син-
хронизации”.
Правила работы с такими флагами состоят в следующем:
1) флаг синхронизации сбрасывается лишь процессом, ожида-
ющим его установки;
2) флаг можно устанавливать только в том случае, если он
уже сброшен (другим процессом), т.к. в противном случае возмож-
на взаимная блокировка (процесс, которому выставляется флаг, не
успевает его сбросить и не обрабатывает соответствующую часть
своей работы).
В нашем случае это означает, что флаг continue[i] дол жен
сбрасываться процессом Worker[i], а флаг arrive[i] должен сбра-
сываться процессом Coordinator. Последний это может делать в
цикле.
БАРЬЕРНАЯ СИНХРОНИЗАЦИЯ С УПРАВЛЯЮЩИМ
ПРОЦЕССОМ
int arrive[1 : n] = ([n]0), continue[1 : n] = ([n]0);
process Worker[i = 1 to n] {
while (true) {
[код решения задачи i];
arrive[i] = 1;
< await (continue[i] == 1); >
continue[i] = 0
}
}
process Coordinator {
while (true) {
for [i = 1 to n] {
< await (arrive[i] == 1); >
arrive[i] = 0;
}
for [i = 1 to n] continue[i] = 1;
64
Страницы
- « первая
- ‹ предыдущая
- …
- 61
- 62
- 63
- 64
- 65
- …
- следующая ›
- последняя »
