Se condividi le variabili su più thread senza la sicurezza del thread, avrai un brutto periodo di determinazione.
Primo piano. Le azioni atomiche sono deterministiche per se stesse.
x = y + 1, ti darà sempre il valore di y +1, qualunque cosa tu sia al momento dell'esecuzione . A livello di sistema, il risultato di questa affermazione è una possibile condizione di competizione dovuta all'aggiornamento in un thread diverso.
Questo non è tecnicamente un caso di "non determinismo", come sarebbe se tu dovessi fare
x = y + 1 * rand () (senza usare un seme impostato). Questa è una condizione di gara più dritta perché stai facendo ipotesi sullo stato delle variabili che potrebbero essere o non essere corrette.
La realtà di questa situazione è "non farlo". Non usare variabili condivise tra thread. Copia le informazioni di input in thread, copia le informazioni. Assicurati sempre che i tuoi thread abbiano i dati necessari per svolgere il loro lavoro e assicurati che non debbano mai raggiungere il loro spazio di discussione locale per farlo.
Se hai assolutamente e assolutamente bisogno di colpire dati condivisi, devi usare le primitive di sincronizzazione, ma rende le cose molto più semplici se adotti un paradigma in cui i thread non colpiscono la memoria condivisa se non per depositare i risultati.
E a quel punto puoi usare cose come code senza serratura e altri meravigliosi frammenti per evitare l'intera procedura di blocco / sblocco.
A scopo informativo. se devi assolutamente condividere y tra i thread. Suggerirei di utilizzare un blocco di scrittura in stile gate per bloccare l'accesso a y mentre viene scritto dall'altra thread. tutte le altre volte sarete in grado di leggere immediatamente poiché il cancello sarebbe "aperto" ai lettori.