A.12 Использование директивы atomic
В следующем примере избежать состояния гонки (синхронные обновления элемента x несколькими потоками) с помощью atomic директива (Раздел 2.6.4 на странице : 19)
#pragma omp parallel for shared(x, y, index, n)
for (i=0; i<n; i++)
{
#pragma omp atomic
x[index[i]] += work1(i);
y[i] += work2(i);
}
Преимущество использования atomic директива в этом примере, что он допускает обновления 2 различных элементов x, чтобы выполняться параллельно. Если набор узлов a critical директива (Раздел 2.6.2 на странице 18) использовать вместо, тогда все обновления к элементам x выполнять последовательно (но не гарантированном в любом порядке).
Обратите внимание, что atomic директива применяется только к выписке c или C++ непосредственно после него. В результате элементы y обновление атомарным образом в этом примере.