In quali circostanze non è sicuro avere due thread diversi che scrivono simultaneamente su elementi adiacenti dello stesso array su x86? Capisco che su alcune architetture simili a DS9K con modelli di memoria folle questo può causare lacerazione di parole, ma su byte x86 singoli sono indirizzabili. Ad esempio, nel linguaggio di programmazione D real
è un tipo a virgola mobile a 80 bit su x86. Sarebbe sicuro di fare qualcosa di simile:Word Tearing su x86
real[] nums = new real[4]; // Assume new returns a 16-byte aligned block.
foreach(i; 0..4) {
// Create a new thread and have it do stuff and
// write results to index i of nums.
}
Nota: Lo so che, anche se questo è sicuro, a volte può causare problemi falsi di condivisione con la cache, che porta a rallentare le prestazioni. Tuttavia, per i casi d'uso che ho in mente, le scritture non saranno abbastanza frequenti perché ciò non sia importante nella pratica.
Modifica: non preoccuparti di leggere i valori scritti. L'ipotesi è che ci sia essere la sincronizzazione prima di qualsiasi valore letto. Mi interessa solo la sicurezza di scrivendo in questo modo.
Immagino che stiate osservando le scritture sporche degli indirizzi adiacenti? – BCS