Le CPU moderne non sempre scrivono i dati in memoria nell'ordine in cui sono stati aggiornati, ad esempio se si esegue lo pseudo codice (assumendo che le variabili siano sempre memorizzate nella memoria qui per semplicità);
a = 1
b = a + 1
... la CPU può benissimo scrivere b
alla memoria prima che scrive a
alla memoria. Questo non è un problema purché si eseguano le cose in un singolo thread, poiché il thread che esegue il codice sopra non vedrà mai il vecchio valore di entrambe le variabili una volta che i compiti sono stati fatti.
Il threading multiplo è un'altra cosa, si potrebbe pensare che il seguente codice consentirebbe ad un altro thread di raccogliere il valore del proprio calcolo pesante;
a = heavy_computation()
b = DONE
... l'altro thread facendo ...
repeat while b != DONE
nothing
result = a
Il problema però è che la bandiera fatto può essere impostato in memoria prima che il risultato viene memorizzato nella memoria, in modo da l'altro thread può raccogliere il valore dell'indirizzo di memoria a prima che il risultato del calcolo sia scritto in memoria.
Lo stesso problema sarebbe - se Thread.start
e Thread.join
non ha un "accade prima" garanzia - dare problemi con il codice simili;
a = 1
Thread.start newthread
...
newthread:
do_computation(a)
... poiché a
non può avere un valore memorizzato nella memoria quando il filo si avvia.
Dal momento che si vuole quasi sempre il nuovo thread per essere in grado di utilizzare i dati è stata inizializzata prima di iniziarlo, Thread.start
ha un "avviene prima" garanzia, vale a dire, i dati che è stato aggiornato prima di chiamare Thread.start
è garantito per essere disponibili alla nuova discussione.La stessa cosa vale per Thread.join
in cui è garantito che i dati scritti dal nuovo thread siano visibili al thread che lo unisce dopo la terminazione.
Semplifica la filettatura.
fonte
2013-04-27 06:29:27
"succursale prima" significa che tali serie di istruzioni sono garantite per l'esecuzione prima di un'altra serie di istruzioni. Quindi in 1 ° scenario .. le istruzioni che portano all'apertura di un nuovo thread hanno una relazione prima-accade con le istruzioni che verranno eseguite dal thread appena avviato. Qualsiasi modifica apportata da tali istruzioni sarà visibile alle istruzioni eseguite dal thread. –
Trovo utile questa pagina: http://preshing.com/20130702/the-happens-before-relation/ Fornisce esempi di come una relazione "succede prima" tra A e B sia diversa da A che sta effettivamente accadendo prima di B. –