Senza ulteriore coordinamento, almeno uno scrittore più un lettore può comportare una classica condizione di gara.
Ci sono una serie di fattori coinvolti.
Se è coinvolta solo una posizione di memoria (un byte o una parola allineata) è possibile che due thread, uno scrittore e un lettore, che accede alla stessa posizione, comunichino effettivamente. (L'allineamento è solitamente importante nel contesto del modello di memoria del professore, poiché i dati non allineati agiscono come due o più posizioni di memoria indipendenti)
Tuttavia, mantenere solo queste limitazioni non consente un'interazione generosa o ricca tra due thread.
Coinvolgere più di una posizione di memoria o più di uno scrittore e quasi sicuramente è necessaria la sincronizzazione esplicita.
Ci sono varie istruzioni del processore che facilitano la sincronizzazione.
Un set funziona come un atomico read-modify-write e consente a più writer di fare, tra le altre cose, di incrementare un contatore senza perdere alcun conteggio. Questi sono a volte implementati come istruzioni di confronto e scambio. Esistono numerose varianti, incluse le associazioni accoppiate collegate al carico e archiviate.
Ci sono anche istruzioni sulla barriera di memoria che dicono al processore qualcosa su quando e come svuotare le cache dei singoli processori nella memoria principale comune.
Queste primitive possono essere utilizzate per costruire serrature più grandi. La maggior parte dei sistemi operativi fornirà alcune ricche funzionalità di sincronizzazione dei thread che sono in qualche modo costruite su queste primitive hardware.
I linguaggi di programmazione e i sistemi operativi espongono queste primitive hardware attraverso metodi e metodi di bloccaggio sincronizzati. blocchi e variabili volatili.
Le transazioni e la memoria transazionale sono un'altra caratteristica molto interessante con un supporto hardware sottostante di base, ma è ancora molto nuovo.