Изменение одного (общего) значения несколькими потоками является условием гонки и приводит к неверным результатам.Если несколько потоков работают с одним значением, все они должны только читать значение.
Идиоматическое решение состоит в том, чтобы использовать сокращение OpenMP следующим образом
#pragma omp parallel for reduction(+:x)
for(int i= 0;i<10000;i++){
x+=1;
}
Внутренне каждый поток имеет свой собственныйx
и они добавляются вместе после цикла.
Использование атомарности является альтернативой, но будет работать значительно хуже.Атомарные операции более затратны сами по себе, а также очень вредны для кэшей.
Если вы используете атомарные операции, вы должны использовать атомарные элементы OpenMP, которые применяются к операции, а не к переменной.Т.е.
#pragma omp parallel for
for (int i= 0;i<10000;i++){
#pragma omp atomic
x+=1;
}
Вы не должны, как предполагают другие ответы, использовать атомарность C ++ 11.Их использование является явно неопределенным поведением в OpenMP.Подробнее см. в этом вопросе .