Una domanda veloce di cui mi sono interrogato da tempo; La CPU assegna i valori atomicamente, oppure, è bit per bit (ad esempio, un intero a 32 bit).
Se è un bit alla volta, un altro thread che accede a questa posizione esatta ottiene una "parte" del valore da assegnare?Una CPU assegna un valore atomicamente alla memoria?
Pensa a questo:
Ho due thread e una variabile "unsigned int" condivisa (chiamiamola "g_uiVal").
Entrambi i fili si avvolgono.
On sta stampando "g_uiVal" con printf ("% u \ n", g_uiVal).
Il secondo aumenta semplicemente questo numero.
Il filo di stampa stampa mai qualcosa che non è totalmente o parte del valore "g_uiVal"?
in codice:
unsigned int g_uiVal;
void thread_writer()
{
g_uiVal++;
}
void thread_reader()
{
while(1)
printf("%u\n", g_uiVal);
}
È possibile accedere ai valori a 32 bit che attraversano le linee della cache in questi giorni? –
@Lasse: molti processori desktop moderni consentono letture e scritture non allineate, ma con una significativa riduzione delle prestazioni. Le CPU meno recenti o più piccole (ad esempio per i dispositivi incorporati) tendono a non farlo. Per qualche tempo questo è stato diviso tra processori CISC (tendenzialmente per supportare letture e scritture non allineate) e processori RISC (non), ma qui le distinzioni si stanno attenuando. – leander
I microcontrollori a 8, 16 e 32 bit sono tutti comuni. Su un AVR (con carichi e depositi a 8 bit) è possibile avere un altro ISR (routine di servizio di interrupt) o un altro thread (se si sta eseguendo un sistema operativo multitasking preempibile) scrivere parte della variabile (o solo leggere parte del cambia quello fatto il thread precedente). – nategoose