Der OpenMP-Standard (< = 4,0) sagt über atomic
:OpenMP atomaren auf einen Referenztyp?
#pragma omp atomic [read | write | update | capture ] new-line
expression-stmt
wo
expression-stmt
mit einem der folgenden Formen Ausdruck Anweisung lautet:
...
Wenn Klausel ist Update oder nicht vorhanden:
x++;
...
In den vorhergehenden Ausdrücken:x
v
und (gegebenenfalls) sind beide L-Wert Ausdrücke mit skalaren Typ.
...
Also, wenn ich das richtig interpretieren, der folgende kurze Code-Schnipsel ist illegal:
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;
}
Grund: zu this post Laut, eine Referenz (hier int& reference
) ist kein Skalar Art. Aber der Standard besagt explizit, dass es eins sein muss, um atomic
zu verwenden.
Der Code wird mit g ++ ohne Warnung kompiliert (-Wall -Wextra
).
Meine Frage ist: Habe ich den Standard oder das Konzept von C++ "Referenztyp" missverstanden? Oder kompilieren die meisten Compiler diesen Code, weil ansonsten die Verwendung von atomic
stark eingeschränkt ist (im Grunde können keine Daten auf dem Heap das Ziel von atomic
sein, weil Sie immer einen Verweis oder einen dereferenzierten Zeiger benötigen)?
Vielen Dank für die Erklärung :) – Gugi