код. После завершения всех потоков при передаче управления в по-
следовательный код проводится проверка на установленный флаг ис-
ключения. Если флаг исключения установлен, то последовательный
код генерирует исключение (или ошибку) с сохраненным объектом в
качестве параметра. В этом случае исключение перехватывается тем
try- или catch-блоком, который отвечает за него в исходном однопо-
точном коде, и логика работы программы не изменяется.
Некоторые языки, например C++11, поддерживают обмен исключе-
ниями в многопоточной среде [7]. Этот механизм также может быть
применен для передачи исключения в однопоточный код.
Основная проблема — упорядочение управления при генерации ис-
ключения. Необходимо, чтобы логика обработки исключения не изме-
нилась, несмотря на то, что вследствие преобразования кода в много-
поточный может произойти переупорядочивание операций при выпол-
нении. Для решения этой проблемы предложен следующий алгоритм.
Шаг 1.
В однопоточном коде всем операторам, генерирующим ис-
ключение, присваивается временн´ая метка, отражающая порядок вы-
полнения операторов. Если один и тот же оператор участвует в форми-
ровании нескольких трасс потоков, то каждой трассе в соответствии
с порядком выполнения программы для этого оператора назначается
своя временн´ая метка. В качестве временн´ой метки можно использо-
вать естественные признаки, например номер итерации цикла. Если
один и тот же оператор может быть реализован в потоке несколько
раз, то необходимо применять стратегию для присвоения временн ´ых
меток, например, использовать номер итерации цикла или комбини-
ровать метки с другими признаками, определяющими порядок вы-
полнения операторов. Приведем простую стратегию для простановки
временн ´ых меток:
1) для последовательности операторов метки проставляются после-
довательно;
2) для ветвления метки проставляются последовательно для каждо-
го выполняемого блока. Так, при нумерации с
k
then-блоку при-
сваиваются метки
k
+ 1
, k
+ 2
, . . . , k
+
n
, а else-блоку — метки с
k
+
n
+ 1
;
3) при наличии циклов номер итерации является множителем вре-
менной метки.
Таким образом, основным требованием к распараллеливаемому ко-
ду является его структурированность.
Шаг 2.
В процессе преобразования кода в многопоточный каждо-
му создаваемому потоку присваивается флаг генерации исключения и
флаг успешного завершения. Кроме того, для каждого потока, гене-
рирующего исключение, необходимо зарезервировать область памяти
для хранения объекта этого исключения. Флаг генерации исключения
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. “Приборостроение”. 2014. № 6 75