Dire che ho un grande array e voglio elaborare il contenuto con più thread. Se delegare ciascun thread a una sezione specifica, garantendo l'assenza di sovrapposizioni, elimina qualsiasi necessità di blocco, presupponendo che i thread non accedano a nessun'altra memoria al di fuori dell'array?È possibile evitare il blocco garantendo che più thread non accedano alla stessa memoria?
Qualcosa di simile (pseudo-codice):
global array[9000000];
do_something(chunk) {
for (i = chunk.start; i < chunk.end; i++)
//do something with array
}
main() {
chunk1 = {start: 0, end: 5000000};
chunk2 = {start: 5000000, end: 9000000};
start_thread(thread1, do_something(chunk1));
start_thread(thread2, do_something(chunk2));
wait_for_join(thread1);
wait_for_join(thread2);
//do something else with the altered array
}
Esiste un compilatore che non fornisce questo comportamento in C++ 03? Anche se, sebbene non fosse formalizzato, era una caratteristica piuttosto comune sull'hardware moderno ... – Errata
Non ha nulla a che fare con l'hardware. Diciamo che voglio copiare 15 byte da src a dst. Il compilatore legge il byte in dst che dovrebbe rimanere invariato, copia 16 byte usando un registro vettoriale, scrive il byte indietro. Tutto mentre un altro thread guardava quel byte. Il tuo codice sorgente non ha accesso allo stesso codice, ma il codice compilato lo ha fatto. C11 e C++ 11 non lo faranno. Ricorda che diversi campi di bit possono contare come la stessa memoria. – gnasher729