2014-06-16 15 views
5

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:
xv 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)?

Antwort

5

Ein Referenztyp ist kein Skalartyp. Diese Tatsache hat jedoch keinen Einfluss auf Ihre Frage. Die wichtige Tatsache ist, dass ein Ausdruck, der einen Verweis auf einen Skalartyp auswertet, ein Lvalue mit Skalartyp ist. Um genau zu sein, die Variablereference hat int& gibt aber den Ausdruckreference hat int und Wertkategorie lvalue eingeben. Also ja, dein Programm ist konform.

+0

Vielen Dank für die Erklärung :) – Gugi