Поделиться через


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 обновление атомарным образом в этом примере.