Suppongo che in questi casi la "Mancanza del modello di memoria" significhi solo che gli ottimizzatori sono stati scritti prima che il modello di memoria C++ 11 sia stato pubblicato e potrebbero ora eseguire ottimizzazioni non valide. È molto difficile e richiede molto tempo per convalidare le ottimizzazioni rispetto al modello di memoria, quindi non è una sorpresa che i team clang/gcc non abbiano ancora finito.
Una mancanza di supporto del modello di memoria significa che i programmi legali C++ 11 che utilizzano std :: atomic arent seq sono coerenti?
Sì, questa è una possibilità. È anche peggio: il compilatore potrebbe introdurre le corse di dati in (secondo lo standard C++ 11) senza gara, ad es. introducendo scritture speculative.
Ad esempio, diversi compilatori C++ utilizzati per eseguire questa ottimizzazione:
for (p = q; p = p -> next; ++p) {
if (p -> data > 0) ++count;
}
Potrebbe ottenere ottimizzato in:
register int r1 = count;
for (p = q; p = p -> next; ++p) {
if (p -> data > 0) ++r1;
}
count = r1;
Se tutto p->data
sono non-negativo, il codice sorgente originale non ha scritto a count
, ma il codice ottimizzato lo fa. Questo può introdurre una corsa di dati in un programma altrimenti senza gara, quindi la specifica C++ 11 non consente tali ottimizzazioni. I compilatori esistenti ora devono verificare (e correggere se necessario) tutte le ottimizzazioni.
Vedere Concurrency memory model compiler consequences per dettagli.
L'atomicità è una delle (tre?) Proprietà del modello di memoria, insieme alla visibilità della memoria e all'ordinamento della memoria. L'atomicità non è un "sinonimo" del modello di memoria. – mloskot