Стандарт OpenMP (<= 4.0) говорит о atomic
:
#pragma omp atomic [read | write | update | capture ] new-line
expression-stmt
где
expression-stmt
это выражение выражения с одним из
следующие формы:
…
Если пункт обновлен или отсутствует:
x++;
…
В предыдущих выражениях:
x
а такжеv
(в зависимости от обстоятельств) оба выражения l-значения с скаляр тип.
…
Итак, когда я правильно интерпретирую это, следующий фрагмент кода недопустим:
int main()
{
int myCounter = 0;
int& reference = myCounter;
#pragma omp parallel for
for (int i = 0; i < 100; ++i)
{
#pragma omp atomic
reference++; // Increment through reference.
}
return 0;
}
Причина: согласно эта почта, ссылка (здесь int& reference
) не является скалярным типом. Но стандарт прямо заявляет, что он должен быть один, чтобы использовать atomic
,
Код компилируется с g ++ без предупреждения (-Wall -Wextra
).
У меня вопрос: неправильно ли я понял стандарт или концепцию «ссылочного типа» в C ++? Или большинство компиляторов компилируют этот код, потому что в противном случае использование atomic
строго ограничен (в основном, данные о куче не могут быть целью atomic
потому что вам всегда нужна ссылка или разыменованный указатель)?
Тип ссылки не является скалярным типом. Однако этот факт не имеет отношения к вашему вопросу. Важным фактом является то, что выражение, которое оценивает ссылку на скалярный тип является lvalue со скалярным типом. Чтобы быть конкретным, переменная reference
имеет тип int&
но выражение reference
имеет тип int
и категория значения lvalue. Так что да, ваша программа соответствует.