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
ev
(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)?
Mille grazie per la spiegazione :) – Gugi