71
несколькими нитями. В этом случае
происходит предотвращение
прерывания доступа, чтения и записи данных, находящихся в общей
памяти, со стороны других потоков.
Отметим,
что синхронизация atomic является альтернативой
директивы
reduction. Применяется эта синхронизация только для
операторов, следующих непосредственно за определяющей ее директивой.
Синхронизация
atomic - очень дорогая
операция с точки зрения
трудоемкости выполнения программы. Она выполняется автоматически
по умолчанию при завершении циклов в параллельном режиме. Для того
чтобы ее исключить, следует использовать директиву
nowait [3,5].
#pragma omp atomic [read | write | update | capture ]оператор
или
#pragma omp atomic capture структурированный блок
Пример 3.17.
#include
#include
int main()
{
int x;
x=0;
#pragma omp parallel shared(x)
{
#pragma omp atomic
x=x++;
}
printf(“Число нитей %d\n”,x);
return 0;}
В
данном
примере
директива
atomic
используется
для
предотвращения
одновременного
изменения
несколькими
нитями
значения переменной x. Результатом работы программы является общее
количество нитей.
3.5.4 Замки
Один из вариантов синхронизации в
OpenMP реализуется через
механизм замков (
locks). В качестве замков используются общие
целочисленные переменные (размер должен быть достаточным для
72
хранения адреса). Данные переменные должны использоваться только как
параметры примитивов синхронизации.
Замок
может
находиться
в
одном
из
трёх
состояний:
неинициализированный,
разблокированный
или
заблокированный.
Разблокированный замок может быть захвачен некоторой нитью. При
этом он переходит в заблокированное состояние. Нить, захватившая
замок, и только она может его освободить, после чего замок возвращается
в разблокированное состояние.
Есть два типа замков: простые замки и множественные замки.
Множественный замок может многократно
захватываться одной нитью
перед его освобождением, в то время как простой замок может быть
захвачен только однажды. Для множественного
замка вводится понятие
коэффициента
захваченности
(nesting
count).
Изначально
он
устанавливается в ноль, при каждом следующем захватывании
увеличивается на единицу, а при каждом
освобождении уменьшается на
единицу. Множественный замок считается разблокированным, если его
коэффициент захваченности равен нулю.
Для
инициализации
простого
или
множественного
замка
используются
соответственно
функции
Достарыңызбен бөлісу: