OpenMP атомарный по ссылочному типу?

Стандарт 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потому что вам всегда нужна ссылка или разыменованный указатель)?

5

Решение

Тип ссылки не является скалярным типом. Однако этот факт не имеет отношения к вашему вопросу. Важным фактом является то, что выражение, которое оценивает ссылку на скалярный тип является lvalue со скалярным типом. Чтобы быть конкретным, переменная reference имеет тип int& но выражение reference имеет тип int и категория значения lvalue. Так что да, ваша программа соответствует.

5

Другие решения


По вопросам рекламы [email protected]