24
ся левая часть оператора, а именно изменение какой-либо пере-
менной. Правая часть не попадает в критическую область, поэто-
му если в правой части стоит, к примеру, вызов длительной вы-
числительной функции, это не вызовет задержки всех остальных
потоков.
В некоторых случаях бывает необходимо выполнять неко-
торые участки тела распараллеленного цикла
в том порядке, в ко-
тором они выполнялись бы в последовательном цикле. Для обо-
значения таких участков в теле распараллеленного цикла служит
директива ordered. Директива for соответствующего цикла долж-
на содержать при этом параметр ordered.
1.1.4 Разделение данных
Очевидно, что при многопоточной работе потребуется оп-
ределить, какие данные будут общими для всех потоков, а какие
будут частными для каждого из них. С этой целью интерфейс
OpenMP предусматривает директиву threadprivate, а также не-
сколько параметров для директив parallel, sections, for и single.
По умолчанию переменные, объявленные вне параллельного
региона, считаются общими; объявленные внутри, кроме стати-
ческих, – частными. Такая интерпретация может быть изменена с
помощью параметра default(none) директивы parallel.
Директива threadprivate объявляет разделенный запятыми
список глобальных либо статических переменных, которые сле-
дует сделать частными. В момент создания потоков в начале па-
раллельного региона для такой переменной в каждом потоке соз-
дается своя копия. До момента первого обращения каждая копия
инициализируются
в соответствии со строкой инициализации ис-
ходной переменной. Если в строке инициализации исходной пе-
ременной фигурируют какие-либо объекты или другие перемен-
ные, их значения не должны меняться до момента инициализации
копии переменной, т.е. до первого обращения к ней. Поскольку с
момента инициализации переменной в главном потоке до момен-
та создания потоков в параллельном регионе ее значение может
быть изменено, значения частных переменных могут отличаться
от значения в главном потоке. Однако при входе в параллельный