Il tuo esempio funzionerebbe perfettamente.
Più processori utilizzano uno coherency protocol come MESI per garantire che i dati rimangano sincronizzati tra le cache. Con MESI, ogni riga della cache viene considerata come modificata, mantenuta esclusivamente, condivisa tra CPU o non valida. La scrittura di una linea cache condivisa tra i processori lo costringe a diventare non valido nelle altre CPU, mantenendo sincronizzate le cache.
Tuttavia, questo non è abbastanza. Diversi processori hanno un diverso memory models e la maggior parte dei processori moderni supporta un certo livello di riordino degli accessi alla memoria. In questi casi, sono necessari memory barriers.
Per esempio se si dispone di Discussione A:
DoWork();
workDone = true;
And Thread B:
while (!workDone) {}
DoSomethingWithResults()
Con entrambi in esecuzione su processori separati, non v'è alcuna garanzia che le scritture fatte entro DoWork() verrà essere visibili al thread B prima che la scrittura su workDone e DoSomethingWithResults() procedano con uno stato potenzialmente incoerente. Le barriere della memoria garantiscono un po 'di ordinamento delle letture e delle scritture - aggiungendo una barriera di memoria dopo DoWork() nel thread A forzerebbe tutte le letture/scritture fatte da DoWork a completare prima della scrittura su workDone, in modo che Thread B ottenga una visualizzazione coerente. I mutex forniscono intrinsecamente una barriera di memoria, in modo che le letture/scritture non possano passare una chiamata per bloccare e sbloccare.
Nel vostro caso, un processore segnalerebbe agli altri che esso ha sporcato una linea di cache e forza gli altri processori a ricaricarsi dalla memoria. L'acquisizione del mutex per leggere e scrivere il valore garantisce che la modifica della memoria sia visibile all'altro processore nell'ordine previsto.
Grazie mille per questa risposta. Mi chiedevo se una sorta di meccanismo a livello di hardware dovesse entrare in gioco qui, perché sembrava che ci fossero dei limiti pratici su ciò che poteva essere realizzato a livello di linguaggio/compilatore. – csj