довательном коде мешает применению стандартных практик распа-
раллеливания [10].
Во многих языках обработка исключений — стандартная практи-
ка, без применения которой невозможно написать корректно работа-
ющую программу. Инструкции для обработки исключений можно ча-
сто встретить в пользовательских программах. Поэтому в настоящей
работе исследованы способы распараллеливания фрагментов кода, со-
держащих обработку исключений.
Постановка задачи.
Примем обозначения операторов, отвечаю-
щих за работу с исключениями, в соответствии со стандартом языка
Java [6]:
1) оператор генерации исключения throw;
2) try-блок, содержащий инструкции, которые могут сгенерировать
исключения. Исключения, произошедшие в try-блоке, могут
быть перехвачены и обработаны. Исключения, произошедшие
вне try-блока и внутри его, но не перехваченные ни одним из
catch-блоков, переходят на уровень вверх;
3) catch-блок, содержащий обработчик исключения для соответ-
ствующего ему try-блока;
4) finally-блок, выполняемый независимо от того, произошло ли
исключение в try-блоке.
Следовательно, проблемы при распараллеливании будут наблю-
даться в тех случаях, когда фрагмент кода, который может быть выде-
лен в отдельный поток, сгенерирует исключение, обработчик которого
находится вне этого фрагмента. Если не принять никаких дополни-
тельных мер, то поток, сгенерировавший исключение, просто аварий-
но завершится. Потоки, которые выполняются параллельно с потоком,
сгенерировавшим исключение, продолжат выполнение, игнорируя от-
сутствие действий со стороны завершившегося потока. Это может
привести программу в состояние, при котором она не эквивалентна
своей однопоточной версии, поскольку выходное состояние распарал-
леленного фрагмента после его выполнения будет отличаться от то-
го, которое имелось бы на выходе исходного фрагмента. Если поток,
сгенерировавший исключение, содержит инструкции блокировки (на-
пример, при доступе к разделяемым данным потоков), то генерация
исключения без освобождения объекта блокировки может привести
к взаимной блокировке оставшихся потоков, продолживших выпол-
нение.
Для решения этой проблемы определим следующие требования к
результату распараллеливания кода, содержащего исключения.
1. Исключения должны быть сгенерированы в том порядке, в кото-
ром они бы были выброшены при использовании однопоточной моде-
ли. Допустим, что есть однозначное соответствие между операторами
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. “Приборостроение”. 2014. № 6 73