Immaginate un codice che rilascia un puntatore comune:
auto tmp = &(the_ptr->a);
*tmp = 10;
the_ptr.dec_ref();
Se dec_ref() non dispone di una "release" semantica, è perfettamente soddisfacente per un compilatore (o CPU) per spostare le cose da prima dec_ref() per dopo (per esempio):
auto tmp = &(the_ptr->a);
the_ptr.dec_ref();
*tmp = 10;
e questo non è sicuro, poiché dec_ref() può anche essere chiamato da altro thread nello stesso tempo ed eliminare l'oggetto. Quindi, deve avere una semantica di "rilascio" per le cose prima di dec_ref() per rimanere lì.
Ora lascia immaginare distruttore di quell'oggetto assomiglia a questo:
~object() {
auto xxx = a;
printf("%i\n", xxx);
}
anche modificheremo esempio un po 'e avrà 2 discussioni:
// thread 1
auto tmp = &(the_ptr->a);
*tmp = 10;
the_ptr.dec_ref();
// thread 2
the_ptr.dec_ref();
Poi, il codice "aggregato" cercherà come:
// thread 1
auto tmp = &(the_ptr->a);
*tmp = 10;
{ // the_ptr.dec_ref();
if (0 == atomic_sub(...)) {
{ //~object()
auto xxx = a;
printf("%i\n", xxx);
}
}
}
// thread 2
{ // the_ptr.dec_ref();
if (0 == atomic_sub(...)) {
{ //~object()
auto xxx = a;
printf("%i\n", xxx);
}
}
}
Tuttavia, se abbiamo solo un "rilascio" semantica per atomic_sub(), questo c ode può essere ottimizzato in questo modo:
// thread 2
auto xxx = the_ptr->a; // "auto xxx = a;" from destructor moved here
{ // the_ptr.dec_ref();
if (0 == atomic_sub(...)) {
{ //~object()
printf("%i\n", xxx);
}
}
}
Ma in questo modo, non sarà sempre distruttore stampare l'ultimo valore di "a" (questo codice non è la gara più libero). Ecco perché abbiamo anche bisogno di acquisire semantica per atomic_sub (o, in senso stretto, abbiamo bisogno di una barriera di acquisizione quando il contatore diventa 0 dopo il decremento).
"parlando del compilatore che sposta l'eliminazione prima dell'operazione atomica" - 1:23:34: "il codice rimane sotto e sopra" ;;; "o semplicemente riferendosi a quando gli effetti collaterali diventano visibili ad altri thread." - quali effetti collaterali? leggi-modifica-scrivi ogni volta vedi l'ultimo valore nell'ordine di modifica – qble
"ma rilassato avrebbe ancora più problemi." - quali problemi? – qble
_ "quali problemi?" _ Un'operazione rilassata non è affatto un'operazione di sincronizzazione. –