Диаграмма активности UML: форк с защитными условиями на выходах
Я встретил семантическую проблему с условиями охраны и разветвлениями диаграмм действий. Предположим, что завершающее действие A ведет к вилке, а выход вилки ведет к действиям B и C (то есть эта вилка имеет 1 вход и 2 выхода). Если A успешно завершен, и защитное условие B является действительным, в то время как защитное условие C не выполнено, будет ли вся активность продолжаться до действия B и ожидает, пока защитное условие C станет истинным, или ни B, ни C не будут выполнены?
Обновление: рассмотрите следующий пример деятельности
Предположим, что в первый раз, когда A завершается, условие защиты C недействительно, пока B не имеет защиты. Вдоль узла слияния A выполняется во второй раз. После второго завершения A защитное условие C становится вечно действительным, и оно будет выполняться дважды непрерывно из-за первого и второго завершения A. Является ли это правильным?
1 ответ
Однажды A
закончено, появится токен, и вилка будет дублировать его. Один токен идет прямо к B
который после завершения перезапускает A
до бесконечности. Теперь, что происходит с токеном, путешествующим в C
? Они просто стоят в очереди у охранника. Когда через некоторое время охранник открывается, он пропускает один токен (потому что C
может держать только один). когда C
Закончено, это позволит войти другому токену (если за это время появилось несколько токенов) в зависимости от охраны. В принципе C
можно запустить столько раз, сколько A
было завершено раньше.
NB. Ваш смысл в вопросе "условия охраны на выходах" неверен. Охранник всегда на входящем потоке управления действия. Вилка не будет контролировать охрану, это действие. И далее действие никогда не может иметь охрану на выходе. Это контролируется поведением действия. Когда он завершается, он появляется в каждом из своих исходящих потоков управления (так называемый неявный ответвление).
Ответ на первоначальный вопрос оставлен как общая информация
На самом деле, когда вы рисуете, ситуация очевидна:
Токен, выходящий справа от верхней вилки, будет заблокирован. B
начнется, так как токен прошел охранника. Так как C
не запускается, нижняя вилка зависнет, так как для этого нужно 2 токена. Так D
не достигается Если только охранник из C
когда-нибудь будет разблокирован снаружи.