Лекция: Атомарная директива.

Частым случаем использования критических секций на практике является обновление общих переменных. Например, если переменная sum является общей и оператор вида sum = sum + exprнаходится в параллельной области программы, то при одновременном выполнении данного оператора несколькими нитями можно получить некорректный результат. Чтобы избежать такой ситуации можно воспользоваться механизмом критических секций или специально предусмотренной для таких случаев директивой atomic.

#pragma omp atomic

оператор

Данная директива относится к идущему непосредственно за ней оператору присваивания (на используемые в котором конструкции накладываются достаточно понятные ограничения), гарантируя корректную работу с общей переменной, стоящей в его левой части. На время выполнения оператора блокируется доступ к данной переменной всем запущенным в данный момент нитям, кроме нити, выполняющей операцию. Атомарной является только работа с переменной в левой части оператора присваивания, при этом вычисления в правой части не обязаны быть атомарными.

Директива atomic работает быстрее, чем критические секции, так как некоторые атомарные операции могут быть напрямую заменены командами процессора.

Следующий пример иллюстрирует применение директивы atomic. В данном примере производится подсчет общего количества порожденных нитей. Для этого каждая нить увеличивает на единицу значение переменной count. Для того, чтобы предотвратить одновременное изменение несколькими нитями значения переменной, стоящей в левой части оператора присваивания, используется директива atomic.

#include <stdio.h>
#include <omp.h>
int main(int argc, char *argv[])
{
int count = 0;

#pragma omp parallel
{
#pragma omp atomic
count++;
}

printf(«Число нитей: %d\n», count);
}


 

еще рефераты
Еще работы по информатике