2014-06-16 27 views
5

L'OpenMP standard (< = 4.0) dice di atomic:OpenMP atomico su un tipo di riferimento?

#pragma omp atomic [read | write | update | capture ] new-line
expression-stmt

dove expression-stmt è un'istruzione di espressione con una delle seguenti forme :
...
Se clausola è aggiornamento o non presente:
x++;
...
Nelle espressioni precedenti:
x e v (se del caso) sono entrambe le espressioni l valore con scalare tipo.
...

Così, quando interpreto correttamente, il seguente frammento di codice corto è illegale:

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; 
} 

Motivo: Secondo this post, un riferimento (qui int& reference) non è uno scalare genere. Ma lo standard afferma esplicitamente che deve essere uno, al fine di utilizzare atomic.

Il codice viene compilato con g ++, senza alcun avviso (-Wall -Wextra).

La mia domanda è: ho frainteso lo standard, o il concetto di "tipo di riferimento" del C++? Oppure la maggior parte dei compilatori compilano questo codice, perché altrimenti l'uso di atomic è severamente limitato (in pratica nessun dato sull'heap potrebbe essere l'obiettivo di atomic, perché è sempre necessario un riferimento o un puntatore senza riferimenti)?

risposta

5

Un tipo di riferimento non è un tipo scalare. Tuttavia, questo fatto non ha alcun impatto sulla tua domanda. Il fatto importante è che un'espressione che valuta un riferimento a un tipo scalare è un lvalue con tipo scalare. Per essere precisi, il variabilereference ha digitare int& ma il espressionereference ha digitare int e valore di categoria lvalue. Quindi sì, il tuo programma è conforme.

+0

Mille grazie per la spiegazione :) – Gugi