}
}
}).start();
}
// Дождаться завершения потоков. . .
// Однопоточный код
Int num = threadExcNo;
// Найти последнюю валидную запись
while (num
>
= 0 && someVarWrites[num] != null)
num–;
if (num
>
= 0)
someVar = someVarWrites[num];
if (loopThr != null)
throw loopThr;
Аналогичный код может быть создан и с помощью стандартных
механизмов многопоточности. Так, в языке Java для этого может быть
использован интерфейс java.util.concurrent.Future, позволяющий пере-
дать исключение путем генерации исключения ExecutionException ме-
тодом get( ) [6]. Аналогичный механизм присутствует и в языке C++11,
где для этого может применяться класс std::future, метод get() которого
генерирует исключение класса std::future_error [7]. Однако в приведен-
ных ранее листингах потоки создавались вручную в целях повышения
наглядности.
Согласно листингу 3, внутри параллельного кода не используются
механизмы синхронизации, кроме случая генерации исключения. Это
позволяет достичь хороших показателей параллельности полученно-
го кода. Вследствие дополнительных проверок в условии цикла при
возникновении исключения потоки, записи которых не будут учтены,
сразу завершатся, что сокращает время ожидания при возникновении
исключения. Также упрощен код окончательной записи в перемен-
ную. Если исключение не было сгенерировано, то накладные расходы
на обработку ситуации, связанной с исключением, будут минимальны.
Тестирование.
Можно рассчитать время выполнения распаралле-
ленного цикла. Пусть цикл содержит
n
итераций, выполняемых
k
по-
токами, а генерация исключения происходит на итерации
m
. Если
итерации цикла распределены между потоками так, что один поток
выполняет несколько соседних итераций (поток
i
выполняет итерации
в интервале
[
in/k,
(
i
+ 1)
n/k
), то возможны два варианта выполнения
программы:
1) исключение генерируется при выполнении первого потока:
m < n/k
. В этом случае сразу завершается как первый поток, так
и все остальные после получения сигнала о генерации исключения.
При этом время выполнения однопоточной программы будет прибли-
зительно равно времени выполнения многопоточной программы;
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. “Приборостроение”. 2014. № 6 79